Почему я не могу использовать 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.




  1. как CMD работает внутри образа docker?

  2. если я хочу запустите несколько служб, как это сделать? С помощью супервайзера?

624   3  

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

    Ничего не найдено.