Ответ 1
nginx
, как и все хорошо управляемые программы, может быть настроен не на самодеминирование.
Используйте директиву конфигурации daemon off
, описанную в http://wiki.nginx.org/CoreModule.
У меня установлен Nginx на контейнере Docker, и я пытаюсь запустить его следующим образом:
docker run -i -t -p 80:80 mydockerimage /usr/sbin/nginx
Проблема в том, что способ Nginx работает, заключается в том, что начальный процесс немедленно порождает мастер-процесс Nginx и некоторые рабочие, а затем завершает работу. Поскольку Docker просматривает только PID исходной команды, контейнер останавливается.
Как предотвратить остановку контейнера? Мне нужно сказать, чтобы он привязывался к первому дочернему процессу или останавливал исходный процесс Nginx.
nginx
, как и все хорошо управляемые программы, может быть настроен не на самодеминирование.
Используйте директиву конфигурации daemon off
, описанную в http://wiki.nginx.org/CoreModule.
Чтобы расширить ответ Чарльза Даффи, Nginx использует директиву daemon off
для запуска на переднем плане. Если это неудобно поместить в файл конфигурации, мы можем указать это непосредственно в командной строке. Это позволяет легко работать в режиме отладки (на переднем плане) и напрямую переключаться на работу в производственном режиме (на заднем плане) путем изменения аргументов командной строки.
Для запуска на переднем плане:
nginx -g 'daemon off;'
Для запуска в фоновом режиме:
nginx
Чтобы развернуть ответ Джона, вы также можете использовать команду Dockerfile
CMD
следующим образом (в случае, если вы хотите, чтобы он запускался без дополнительных аргументов)
CMD ["nginx", "-g", "daemon off;"]
Добавление этой команды в Dockerfile может отключить ее:
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
Здесь у вас есть пример Dockerfile, который запускает nginx. Как упомянул Чарльз, он использует конфигурацию daemon off
:
https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17
Также полезно использовать supervisord или runit [1] для управления сервисами.
Чтобы добавить ответы Томера и Чарльза,
Синтаксис для запуска nginx в forground в контейнере Docker с использованием Entrypoint:
ENTRYPOINT nginx -g 'daemon off;'
Не связано напрямую, но для запуска нескольких команд с Entrypoint:
ENTRYPOINT /bin/bash -x /myscripts/myscript.sh && nginx -g 'daemon off;'