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


130

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

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

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

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

Ответы:


165

nginx, как и все программы с хорошим поведением, можно настроить не самодемонизацию.

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


15
Спасибо! Чтобы уточнить, это означает редактирование /etc/nginx/nginx.conf и добавление "daemon off;" вверху (т.е. не внутри сервера или другой директивы)
Селдо

6
Меня несколько беспокоит то, что daemon offnginx не поддерживает .
Леонид Шевцов

7
@LeonidShevtsov ... вы имеете в виду, что не был одобрен для использования в производстве до 1.0.9. Постоянное предостережение относительно обновлений на месте не имеет значения для людей, которые делают что-то в стиле Docker.
Чарльз Даффи

Кажется, теперь у них есть перенаправление на стороне сервера (на nginx.org/en/docs/ngx_core_module.html ).
Чарльз Даффи

175

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

Чтобы запустить на переднем плане:

nginx -g 'daemon off;'

Для работы в фоновом режиме:

nginx

3
Может кто-нибудь объяснить, что такое "-g" на самом деле? Я не могу найти этот переключатель в документации только в этом одном примере с nginx, использующим его.
red888

5
@ red888, устанавливает глобальную опцию конфигурации.
Чарльз Даффи

1
CMDбудет CMD ["nginx", "-g", "daemon off;"] для докера
прайагупд

55

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

CMD ["nginx", "-g", "daemon off;"]




6

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

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

ENTRYPOINT nginx -g 'daemon off;' 

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

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


0

Для всех, кто приходит сюда, пытаясь запустить образ nginx в контейнере докера, который будет работать как служба

Поскольку нет целого Dockerfile, вот мое полное Dockerfileрешение проблемы.

Красиво и работает. Спасибо за все ответы здесь, чтобы решить последнюю проблему с nginx.

FROM ubuntu:18.04
MAINTAINER stackoverfloguy "stackoverfloguy@foo.com"
RUN apt-get update -y
RUN apt-get install net-tools nginx ufw sudo -y
RUN adduser --disabled-password --gecos '' docker
RUN adduser docker sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER docker
RUN sudo ufw default allow incoming
RUN sudo rm /etc/nginx/nginx.conf
RUN sudo rm /etc/nginx/sites-available/default
RUN sudo rm /var/www/html/index.nginx-debian.html
VOLUME /var/log
VOLUME /usr/share/nginx/html
VOLUME /etc/nginx
VOLUME /var/run
COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY content/* /var/www/html/
COPY Dockerfile /var/www/html
COPY start.sh /etc/nginx/start.sh
RUN sudo chmod +x /etc/nginx/start.sh
RUN sudo chmod -R 777 /var/www/html
EXPOSE 80
EXPOSE 443
ENTRYPOINT sudo nginx -c /etc/nginx/nginx.conf -g 'daemon off;'

И запустите его с помощью:

docker run -p 80:80 -p 443:443 -dit
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.