В общем, стратегия, которую вы изложили, - это правильный путь; это в основном то, что делают стандартные 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
образ сообщества или создание собственного.