it-roy-ru.com

Как запустить Nginx в контейнере Docker без остановки?

Я установил Nginx на контейнер Docker и пытаюсь запустить его так:

docker run -i -t -p 80:80 mydockerimage /usr/sbin/nginx

Проблема в том, что способ работы Nginx состоит в том, что начальный процесс немедленно порождает основной процесс Nginx и некоторых рабочих, а затем завершает работу. Поскольку Docker наблюдает только PID исходной команды, контейнер останавливается.

Как я могу предотвратить остановку контейнера? Мне нужно, чтобы он мог связать его с первым дочерним процессом или остановить исходный процесс Nginx.

80
Seldo

nginx, как и все программы с хорошим поведением, может быть настроен так, чтобы он не самодемонизировался.

Используйте директиву конфигурации daemon off, описанную в http://wiki.nginx.org/CoreModule .

115
Charles Duffy

Чтобы расширить ответ Чарльза Даффи, Nginx использует директиву daemon off для запуска на переднем плане. Если неудобно помещать это в файл конфигурации, мы можем указать это непосредственно в командной строке. Это позволяет легко работать в режиме отладки (на переднем плане) и напрямую переключаться на работу в производственном режиме (на заднем плане) путем изменения аргументов командной строки.

Для запуска на переднем плане:

nginx -g 'daemon off;'

Для запуска в фоновом режиме:

nginx
111
johntellsall

Чтобы расширить ответ Джона, вы также можете использовать команду DockerfileCMD, как показано ниже (на случай, если вы хотите, чтобы он запускался без дополнительных аргументов)

CMD ["nginx", "-g", "daemon off;"]
34
Tomer Ben David

Добавление этой команды в Dockerfile может отключить ее:

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
6
Afshin Mehrabani

Здесь у вас есть пример Dockerfile, который запускает nginx. Как упомянул Чарльз, он использует конфигурацию daemon off:

https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17

5
creack

Также неплохо использовать supervisord или runit [1] для управления сервисами.

[1] https://github.com/phusion/baseimage-docker

3
Kunthar

Чтобы добавить ответы Томера и Чарльза, 

Синтаксис для запуска nginx на переднем плане в контейнере Docker с использованием Entrypoint:

ENTRYPOINT nginx -g 'daemon off;' 

Не связано напрямую, но для запуска нескольких команд с Entrypoint:

ENTRYPOINT /bin/bash -x /myscripts/myscript.sh && nginx -g 'daemon off;' 
0
Nitb