2015-10-21 3 views
1

Я смотрю http://progrium.viewdocs.io/dokku/process-management/ и пытаюсь выяснить, как получить несколько сервисов из одного проекта.Dokku multi-process (container) с проектом Dockerfile

У меня есть репо с Dockerfile:

FROM wjdp/flatcar 

ADD . app 

RUN /app/bin/install.sh 

EXPOSE 8000 

CMD /app/bin/run.sh 

run.sh запускает однопоточный веб-сервер. Это отлично работает, но я хотел бы запустить несколько сервисов.

Я попытался сделать Procfile с одной строкой web: /app/bin/run.sh и удалив линию CMD из файла Dockerfile. Это не работает без команды, чтобы запустить контейнер Docker не остаться в живых и Докку становится грустно:

remote: Error response from daemon: Cannot kill container ae9d50af17deed4b50bc8327e53ee942bbb3080d3021c49c6604b76b25bb898e: Container ae9d50af17deed4b50bc8327e53ee942bbb3080d3021c49c6604b76b25bb898e is not running 
remote: Error: failed to kill containers: [ae9d50af17deed4b50bc8327e53ee942bbb3080d3021c49c6604b76b25bb898e] 

ответ

0

Лучше всего, вероятно, использовать supervisord. Supervisord - очень легкий менеджер процессов.

Вы должны запустить супервизор с CMD, а затем поместить все процессы, которые хотите запустить, в файл supervisord.conf.

Дополнительную информацию см. В документации Docker об этом: https://docs.docker.com/articles/using_supervisord/. Наиболее соответствующие выдержки (взято с этой страницы, но перефразировать):

Вы бы поместить это в ваш Dockerfile:

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf 
CMD ["/usr/bin/supervisord"] 

И файл supervisord.conf будет содержать что-то вроде этого:

[supervisord] 
nodaemon=true 

[program:sshd] 
command=/usr/sbin/sshd -D 

[program:apache2] 
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND" 

Очевидно, что вам также необходимо убедиться, что на вашем изображении установлено устройство супервизора. Это часть большинства дистрибутивов, поэтому вы можете использовать yum или apt-get для ее установки.

+0

Спасибо, я использовал supervisord раньше, и это пришло в голову, но, пытаясь следовать лучшей практике Docker, я стараюсь избегать запуска более одного основного процесса на контейнер. – wjdp

+0

Это, скорее всего, лучший вариант. Пока не придет поддержка докеров. – wjdp

+0

Возможно, я неправильно понял, что вы пытаетесь сделать. Я думал, вы хотите запустить несколько процессов в одном контейнере? Тем не менее, это руководство действительно является «мягкой» лучшей практикой. Это хорошая идея, когда это имеет смысл, но часто это не так, и иногда на самом деле это невозможно сделать. например, у меня было два процесса, которые подключаются к сокетам TCP в другом. Связывание не поддерживает такую ​​циклическую зависимость. Таким образом, выбор заключался в том, чтобы привязать оба сокета к портам хоста или поместить оба процесса в один и тот же контейнер. –

Смежные вопросы