Рекомендуемый способ обработки пустой и существующей БД в Dockerfile - PullRequest
0 голосов
/ 02 мая 2020

Я хочу запустить M/Monit (https://mmonit.com/) в docker контейнере и нашел это Dockerfile: https://github.com/mlebee/docker-mmonit/blob/master/Dockerfile

I Я использую его с простым docker-compose.yml в моей тестовой среде:

version: '3'
services:
    mmonit:
        build: .
        ports:
        - "8080:8080"
        #volumes:
            #- ./db/:/opt/mmonit/db/

Это работает, но я хочу расширить Dockerfile, чтобы путь /opt/mmonit/db/ экспортировался как том. Я пытаюсь реализовать следующее поведение:

  • Когда том, сопоставленный с /opt/mmonit/db/, пуст (например, при первой установке), файлы из установочного архива должны быть записаны на том. Папка db является частью архива.
  • Когда файл базы данных /opt/mmonit/db/mmonit.db уже существует в томе, его не следует перезаписывать ни при каких обстоятельствах.

Я делаю У меня есть идея, как написать сценарий для необходимых операций / проверок в bash, но я даже не уверен, что было бы лучше заменить ENTRYPOINT пользовательским сценарием запуска или это нужно сделать, изменив Dockerfile только. Вот почему я прошу рекомендованный способ.

1 Ответ

3 голосов
/ 02 мая 2020

В общем, стратегия, которую вы изложили, - это правильный путь; это в основном то, что делают стандартные Docker образы базы данных Hub.

Изображение, на которое вы ссылаетесь, является изображением сообщества, поэтому вы не должны чувствовать особой привязанности к решениям этого изображения. Учитывая отсутствие какого-либо лицензионного файла в репозитории GitHub, вы не сможете скопировать его как есть, но он также не особенно сложен.

Docker поддерживает две "половины" команды для запустить, ENTRYPOINT и CMD. CMD легко указать в командной строке Docker, и, если у вас есть оба, Docker объединяет их вместе в одну команду. Таким образом, очень типичным шаблоном является фактическая команда для запуска (mmmonit -i) в виде CMD, а ENTRYPOINT - скрипт-обертка, выполняющий необходимые настройки, а затем exec "$@".

#!/bin/sh
# I am the Docker entrypoint script

# Create the database, but only if it does not already exist:
if ! test -f /opt/mmonit/db/mmonit.db; then
  cp -a /opt/monnit/db_base /opt/monnit/db
fi

# Replace this script with the CMD
exec "$@"

В вашем Dockerfile вы бы указали CMD и ENTRYPOINT:

# ... do all of the installation ...

# Make a backup copy of the preinstalled data
RUN cp -a db db_base

# Install the custom entrypoint script
COPY entrypoint.sh /opt/monit/bin
RUN chmod +x entrypoint.sh

# Standard runtime metadata
USER monit
EXPOSE 8080
# Important: this must use JSON-array syntax
ENTRYPOINT ["/opt/monit/bin/entrypoint.sh"]
# Can be either JSON-array or bare-string syntax
CMD /opt/monit/bin/mmonit -i

Я бы определенно внес изменения такого рода в Dockerfile, начиная либо с FROM образ сообщества или создание собственного.

...