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.