Во- первых, есть проблема в вашем Dockerfile
:
RUN service mysql restart && /tmp/setup.sh
Образы Docker не сохраняют запущенные процессы. Следовательно, ваша RUN
команда выполняется только во время docker build
фазы и останавливается после завершения сборки. Вместо этого вам нужно указать команду при запуске контейнера с помощью команд CMD
или, ENTRYPOINT
как показано ниже:
CMD mysql start
Во-вторых, контейнеру Docker необходим процесс (последняя команда) для продолжения работы, иначе контейнер выйдет / остановится. Следовательно, обычную service mysql start
команду нельзя использовать непосредственно в Dockerfile.
Решение
Существует три типичных способа поддержания процесса в рабочем состоянии:
Использование service
команды и добавить не конец команды после этого, какtail -F
CMD service mysql start && tail -F /var/log/mysql/error.log
Это часто предпочтительнее, когда у вас запущена одна служба, поскольку она делает выводимый журнал доступным для докера.
Это работает, только если есть сценарий, как mysqld_safe
.
Это лучше всего, если команда должна выполнить серию шагов, опять же, /start.sh
должна продолжаться.
Заметка
Для начинающих использовать supervisord
не рекомендуется. Честно говоря, это излишне. Гораздо лучше использовать одну команду service / single для контейнера.
Кстати: пожалуйста, проверьте https://registry.hub.docker.com для существующих изображений MySQL Docker для справки