По-перше, є проблема у вашому Dockerfile
:
RUN service mysql restart && /tmp/setup.sh
Зображення Docker не зберігають запущені процеси. Тому ваша RUN
команда виконується лише під час docker build
фази та зупиняється після завершення збірки. Натомість вам потрібно вказати команду, коли контейнер запускається з використанням команд CMD
або, ENTRYPOINT
як показано нижче:
CMD mysql start
По-друге, контейнеру докер потрібен процес (остання команда), щоб продовжувати працювати, інакше контейнер вийде / зупиниться. Тому звичайну service mysql start
команду не можна використовувати безпосередньо в Dockerfile.
Рішення
Існує три типові способи тримати процес:
Використовуючи service
команду та додайте некінцеву команду після цього, якtail -F
CMD service mysql start && tail -F /var/log/mysql/error.log
Це часто бажано, коли у вас працює одна служба, оскільки це робить вихідний журнал доступним для докера.
Це працює лише за наявності подібного сценарію mysqld_safe
.
Це найкраще, якщо команда повинна виконати ряд кроків, знову ж таки, /start.sh
слід продовжувати працювати.
Примітка
Для початківців використання supervisord
не рекомендується. Чесно кажучи, це надмірно. Набагато краще використовувати одну службу / одну команду для контейнера.
BTW: перевірте https://registry.hub.docker.com щодо наявних зображень докера mysql для ознайомлення