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


130

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

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

Проблема полягає в тому, що спосіб роботи Nginx полягає в тому, що початковий процес негайно породжує основний процес Nginx та деяких працівників, а потім виходить з ладу. Оскільки Докер дивиться лише PID оригінальної команди, контейнер зупиняється.

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

Відповіді:


165

nginx, як і всі добре сприйняті програми, можна налаштувати не на самодемонізацію.

Використовуйте daemon offдирективу конфігурації, описану в http://wiki.nginx.org/CoreModule .


15
Дякую! Для уточнення це означає редагування /etc/nginx/nginx.conf та додавання "демон демон;" вгорі (тобто не всередині сервера чи іншої директиви)
Seldo

6
Я дещо стурбований тим, що daemon offnginx не схвалюється .
Леонід Шевцов

7
@LeonidShevtsov ... ти маєш на увазі, що не був схвалений для використання у виробництві до 1.0.9. Постійний застереження, що стосується оновлення на місці, не має значення для людей, які роблять справи "Докерський шлях".
Чарльз Даффі

Вони, схоже, зараз мають перенаправлення на стороні сервера (на 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 у forground у контейнері Docker за допомогою Entrypoint:

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.