Comment exécuter Nginx dans un conteneur Docker sans s'arrêter?

130

J'ai Nginx installé sur un conteneur Docker et j'essaye de l'exécuter comme ceci:

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

Le problème est que la façon dont Nginx fonctionne, c'est que le processus initial génère immédiatement un processus Nginx maître et certains travailleurs, puis se ferme. Comme Docker ne regarde que le PID de la commande d'origine, le conteneur s'arrête alors.

Comment empêcher le conteneur de s'arrêter? Je dois être capable de lui dire de se lier au premier processus enfant, ou d'arrêter le processus initial de Nginx de se terminer.

Seldo
la source

Réponses:

165

nginx, comme tous les programmes qui se comportent bien, peuvent être configurés pour ne pas se démoniser automatiquement.

Utilisez la daemon offdirective de configuration décrite dans http://wiki.nginx.org/CoreModule .

Charles Duffy
la source
15
Merci! Pour clarifier, cela signifie éditer /etc/nginx/nginx.conf et ajouter "daemon off;" en haut (c'est-à-dire pas à l'intérieur d'un serveur ou d'une autre directive)
Seldo
6
Je suis un peu inquiet que ce daemon offne soit pas approuvé par nginx .
Leonid Shevtsov
7
@LeonidShevtsov ... vous voulez dire n'a pas été approuvé pour une utilisation en production avant la version 1.0.9. La mise en garde permanente, concernant les mises à niveau sur place, n'a pas d'importance pour les gens qui font les choses à la façon Docker.
Charles Duffy
Ils semblent avoir une redirection côté serveur maintenant (vers nginx.org/en/docs/ngx_core_module.html ).
Charles Duffy
175

Pour développer la réponse de Charles Duffy, Nginx utilise la daemon offdirective pour s'exécuter au premier plan. S'il n'est pas pratique de le mettre dans le fichier de configuration, nous pouvons le spécifier directement sur la ligne de commande. Cela facilite l'exécution en mode débogage (premier plan) et le passage direct en mode production (arrière-plan) en modifiant les arguments de la ligne de commande.

Pour courir au premier plan:

nginx -g 'daemon off;'

Pour exécuter en arrière-plan:

nginx
johntellsall
la source
3
Quelqu'un peut-il expliquer ce qu'est réellement "-g"? Je ne trouve pas ce commutateur dans la documentation uniquement dans cet exemple avec nginx qui l'utilise.
red888
5
@ red888, définit une option de configuration globale.
Charles Duffy
1
CMDsera CMD ["nginx", "-g", "daemon off;"] pour docker
prieragupd
55

Pour développer la réponse de John, vous pouvez également utiliser la Dockerfile CMDcommande comme suit (au cas où vous voudriez qu'elle démarre automatiquement sans arguments supplémentaires)

CMD ["nginx", "-g", "daemon off;"]
Tomer Ben David
la source
10

L'ajout de cette commande à Dockerfile peut le désactiver:

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
Afshin Mehrabani
la source
6

Pour ajouter les réponses de Tomer et Charles,

Syntaxe pour exécuter nginx dans forground dans le conteneur Docker à l'aide d'Entrypoint:

ENTRYPOINT nginx -g 'daemon off;' 

Pas directement lié mais pour exécuter plusieurs commandes avec Entrypoint:

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

Pour tous ceux qui viennent ici en essayant d'exécuter une image nginx dans un conteneur docker, cela fonctionnera en tant que service

Comme il n'y a pas de fichier Docker complet, voici mon ensemble Dockerfile résolution du problème.

Agréable et fonctionne. Merci à toutes les réponses ici afin de résoudre le problème final de nginx.

FROM ubuntu:18.04
MAINTAINER stackoverfloguy "[email protected]"
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;'

Et exécutez-le avec:

docker run -p 80:80 -p 443:443 -dit
Alejandro Teixeira Muñoz
la source