У меня есть Dockerfile для установки сервера MySQL в контейнере, который я затем запускаю так:
sudo docker run -t -i 09d18b9a12be /bin/bash
Но служба MySQL не запускается автоматически, я должен запускаться вручную (из контейнера):
service mysql start
Как автоматически запустить службу MySQL при запуске контейнера Docker?
Ответы:
Во- первых, есть проблема в вашем
Dockerfile
:Образы Docker не сохраняют запущенные процессы. Следовательно, ваша
RUN
команда выполняется только во времяdocker build
фазы и останавливается после завершения сборки. Вместо этого вам нужно указать команду при запуске контейнера с помощью командCMD
или,ENTRYPOINT
как показано ниже:Во-вторых, контейнеру Docker необходим процесс (последняя команда) для продолжения работы, иначе контейнер выйдет / остановится. Следовательно, обычную
service mysql start
команду нельзя использовать непосредственно в Dockerfile.Решение
Существует три типичных способа поддержания процесса в рабочем состоянии:
Использование
service
команды и добавить не конец команды после этого, какtail -F
Это часто предпочтительнее, когда у вас запущена одна служба, поскольку она делает выводимый журнал доступным для докера.
Или используйте команду переднего плана, чтобы сделать это
Это работает, только если есть сценарий, как
mysqld_safe
.Или оберните ваши сценарии
start.sh
и положите в конецЭто лучше всего, если команда должна выполнить серию шагов, опять же,
/start.sh
должна продолжаться.Заметка
Для начинающих использовать
supervisord
не рекомендуется. Честно говоря, это излишне. Гораздо лучше использовать одну команду service / single для контейнера.Кстати: пожалуйста, проверьте https://registry.hub.docker.com для существующих изображений MySQL Docker для справки
источник
docker exec -it <CONTAINER NAME> mysql /etc/init.d/mysqld restart
В вашем
Dockerfile
, добавьте в последней строкеМеня устраивает
И вот результат:
источник
docker stop
илиdocker restart
просто изящно, просто его можно убить.Просто! Добавьте в конце dockerfile:
источник
Docker version 18.09.7, build 2d0083d
без&& /bin/bash
службы немедленно остановитсяЕсть еще один способ сделать это, который я всегда считал более читабельным.
Скажем, что вы хотите запустить rabbitmq и mongodb, когда вы запустите его, тогда ваш
CMD
будет выглядеть примерно так:Так как вы можете иметь только один
CMD
заDockerfile
хитрость заключается в том, чтобы объединить все инструкции с ,&&
а затем использовать\
для каждой команды , чтобы начать новую строку.Если вы добавите ко многим из них, я предлагаю вам поместить все свои команды в файл сценария и запустить его так, как предложил @ larry-cai:
источник
В моем случае у меня есть веб-приложение PHP, обслуживаемое Apache2 в контейнере Docker, который подключается к базе данных MYSQL. Решение Ларри Кая работало с небольшими изменениями. Я создал
entrypoint.sh
файл, в котором я управляю своими услугами. Я думаю, что созданиеentrypoint.sh
когда у вас есть несколько команд для запуска при запуске вашего контейнера, это более чистый способ загрузки Docker.источник
ENTRYPOINT ['your location']
инструкцию на файл сценария. Не забудьте установить права на выполнение в вашем скрипте.COPY entrypoint.sh /entrypoint.sh RUN chmod 755 /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
, В этом примере я скопировал свою точку входа в корневой каталог в контейнере Docker.У меня та же проблема, когда я хочу автоматически запустить службу SSH. Я нашел это приложение
в может решить, но только вы откроете его с помощью bash.источник
Я добавляю следующий код в /root/.bashrc для запуска кода только один раз,
Пожалуйста, передайте этот контейнер изображению перед запуском этого скрипта, в противном случае файл 'docker_services' будет создан в изображениях, и служба не будет запущена.
источник
Вот как я автоматически запускаю службу MySQL всякий раз, когда запускается контейнер Docker.
В моем случае мне нужно запустить не только MySQL, но и PHP, Nginx и Memcached
У меня есть следующие строки в Dockerfile
Добавление && bash позволит поддерживать работу Nginx, MySQL, PHP и Memcached внутри контейнера.
источник
Это не работает
CMD service mysql start && /bin/bash
Это не работает
CMD service mysql start ; /bin/bash ;
- Я думаю, интерактивный режим не будет поддерживать передний план.
Это работает !!
CMD service nginx start ; while true ; do sleep 100; done;
Это работает !!
CMD service nginx start && tail -F /var/log/nginx/access.log
будьте осторожны, вы должны использовать
docker run -p 80:80 nginx_bash
без параметра команды.источник
Следующая документация с веб-сайта Docker показывает, как реализовать службу SSH в контейнере Docker. Он должен быть легко адаптируем для вашего обслуживания:
Вариация по этому вопросу также была задана здесь:
источник
Возможно, нужно удалить существующий контейнер, используя docker prune ...
Импорт с необходимыми изменениями:
Запустите контейнер, например, с опцией всегда перезапускать, чтобы убедиться, что он автоматически возобновит работу после перезагрузки хоста / демона:
Примечание: на мой взгляд, разумно запускать только сервис cron, оставляя контейнер максимально чистым, а затем просто изменить crontab или cron.hourly, .daily и т. Д. ... с соответствующими сценариями проверки / мониторинга. Причина в том, что вы полагаетесь только на одного демона, и в случае изменений с ansible или puppet легче перераспределить скрипты cron вместо отслеживания сервисов, которые запускаются при загрузке.
источник