Como executar o Nginx em um contêiner do Docker sem interromper?


130

Eu tenho o Nginx instalado em um contêiner do Docker e estou tentando executá-lo assim:

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

O problema é que, da maneira como o Nginx funciona, é que o processo inicial gera imediatamente um processo mestre do Nginx e alguns trabalhadores e sai. Como o Docker está apenas observando o PID do comando original, o contêiner pára.

Como evito que o contêiner pare? Eu preciso ser capaz de dizer para vincular ao processo filho primeiro ou impedir que o processo inicial do Nginx saia.

Respostas:


165

nginx, como todos os programas bem comportados, pode ser configurado para não se auto-daemonizar.

Use a daemon offdiretiva de configuração descrita em http://wiki.nginx.org/CoreModule .


15
Obrigado! Para esclarecer, isso significa editar o /etc/nginx/nginx.conf e adicionar "daemon off;" no topo (ou seja, não dentro de um servidor ou outra diretiva)
Seldo 17/09/13

6
Estou um pouco preocupado que daemon offnão seja endossado pelo nginx .
Leonid Shevtsov

7
@LeonidShevtsov ... você quer dizer que não foi aprovado para uso em produção antes da 1.0.9. A ressalva permanente, sobre as atualizações no local, não importa para as pessoas que fazem as coisas da maneira Docker.
Charles Duffy

Agora eles parecem ter um redirecionamento no lado do servidor (para nginx.org/en/docs/ngx_core_module.html ).
Charles Duffy

175

Para expandir a resposta de Charles Duffy, o Nginx usa a daemon offdiretiva para executar em primeiro plano. Se for inconveniente colocar isso no arquivo de configuração, podemos especificá-lo diretamente na linha de comando. Isso facilita a execução no modo de depuração (primeiro plano) e alterna diretamente para a execução no modo de produção (segundo plano) alterando os argumentos da linha de comando.

Para executar em primeiro plano:

nginx -g 'daemon off;'

Para executar em segundo plano:

nginx

3
Alguém pode explicar o que "-g" realmente é? Não consigo encontrar essa opção nos documentos apenas neste exemplo com o nginx usando-a.
precisa saber é

5
@ red888, define uma opção de configuração global.
Charles Duffy

1
CMDserá CMD ["nginx", "-g", "daemon off;"] para estivador
prayagupd 28/08

55

Para expandir a resposta de John, você também pode usar o Dockerfile CMDcomando da seguinte maneira (caso deseje iniciar automaticamente sem argumentos adicionais)

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

10

A adição deste comando ao Dockerfile pode desativá-lo:

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



6

Para adicionar respostas de Tomer e Charles,

Sintaxe para executar o nginx no forground no contêiner do Docker usando o Ponto de Entrada:

ENTRYPOINT nginx -g 'daemon off;' 

Não está diretamente relacionado, mas para executar vários comandos com o Entrypoint:

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


0

Para todos os que vêm aqui tentando executar uma imagem nginx em um contêiner de docker, isso será executado como um serviço

Como não há Dockerfile inteiro, aqui está o meu Dockerfile solução para o problema.

Bom e trabalhando. Obrigado a todas as respostas aqui para resolver o problema final do 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;'

E execute-o com:

docker run -p 80:80 -p 443:443 -dit
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.