Почему я не могу использовать Docker CMD несколько раз для запуска нескольких служб?
Я построил базовый образ из Dockerfile с именем centos + ssh. В Dockerfile centos + ssh я использую CMD для запуска службы ssh.
затем я хочу построить образ запуска другой службы с именем rabbitmq, Dockerfile:
FROM centos+ssh
EXPOSE 22
EXPOSE 4149
CMD /opt/mq/sbin/rabbitmq-server start
чтобы запустить контейнер rabbitmq,запустите:
docker run -d -p 222:22 -p 4149:4149 rabbitmq
но служба ssh не работает, это означает, что Dockerfile CMD rabbitmq переопределяет CMD centos.
- как CMD работает внутри образа docker?
- если я хочу запустите несколько служб, как это сделать? С помощью супервайзера?
3 ответов:
хотя CMD записывается в Dockerfile, это действительно информация о времени выполнения. Так же, как EXPOSE, но вопреки, например, RUN и ADD. Под этим я подразумеваю, что вы можете переопределить его позже, в расширяющемся файле Dockerfile или просто в своей команде run, что и происходит. Во все времена может быть только один CMD.
Если вы хотите запустить несколько служб, я действительно буду использовать супервизор. Вы можете сделать файл конфигурации супервизора для каждой службы, добавить их в каталог, и запустить супервизор с
supervisord -c /etc/supervisorуказать на файл конфигурации супервизора, который загружает все сервисы и выглядит как[supervisord] nodaemon=true [include] files = /etc/supervisor/conf.d/*.confЕсли вы хотите более подробную информацию, я написал блог на эту тему здесь: http://blog.trifork.com/2014/03/11/using-supervisor-with-docker-to-manage-processes-supporting-image-inheritance/
вы правы, второй Dockerfile перезапишет
CMDКоманда Первого из них. Docker всегда будет выполнять одну команду, не более. Так что в конце вашего Dockerfile, вы можете указать один команда для запуска. Не больше.но вы можете выполнить обе команды в одну строку:
FROM centos+ssh EXPOSE 22 EXPOSE 4149 CMD service sshd start && /opt/mq/sbin/rabbitmq-server startчто вы также можете сделать, чтобы сделать ваш Dockerfile немного чище, вы можете поместить свои команды CMD в дополнительный файл:
FROM centos+ssh EXPOSE 22 EXPOSE 4149 CMD sh /home/centos/all_your_commands.shи файл вот так:
service sshd start & /opt/mq/sbin/rabbitmq-server start
хотя я уважаю ответ от qkrijger, объясняющий, как вы можете обойти эту проблему, я думаю, что мы можем узнать гораздо больше о том, что здесь происходит ...
чтобы на самом деле ответить на ваш вопрос "почему" ... Я думаю, что это было бы полезно для вас, чтобы понять, как
docker stopкоманда работает и это все процессы должны быть остановлены штатно чтобы предотвратить проблемы при попытке перезапустить их (повреждение файлов и т. д.).Проблема: Что если докер сделал запустите SSH из его команды и начал RabbitMQ из вашего файла Docker? "команда docker stop сначала пытается остановить запущенный контейнер, отправив сигнал SIGTERM корневому процессу (PID 1) в контейнере. " какой процесс docker отслеживает как PID 1, который получит SIGTERM? Будет ли это SSH или кролик?? " согласно модели процесса Unix, процесс инициализации -- PID 1 -- наследует все осиротевшие дочерние процессы и должен пожинайте их. Большинство контейнеров Docker не имеют процесса инициализации, который делает это правильно, и в результате их контейнеры со временем заполняются зомби-процессами."
ответ: Docker просто принимает этот последний CMD как один это будет запущено как корень процесс С PID 1 и получить SIGTERM от
docker stop.предлагаемое решение: вы должны использовать (или создать) базовый образ, специально созданный для запуска нескольких служб, например,phusion/baseimage
важно отметить, что Тини существует именно по этой причине, и по состоянию на Docker 1.13 и выше, Tini официально является частью Docker, что говорит нам о том, что в Docker работает более одного процесса ДЕЙСТВИТЕЛЬНО .. так что даже если кто-то утверждает, что более квалифицированные что касается Докера, и настаивает на том, что вы абсурдны для того, чтобы думать об этом, знайте, что это не так. Есть совершенно действительные ситуации для этого есть.
хорошо знайте:
Comments