180 votes

Comment faire fonctionner Nginx dans un conteneur Docker sans s'arrêter ?

J'ai installé Nginx sur un conteneur Docker, et j'essaie 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, est que le processus initial génère immédiatement un processus Nginx maître et quelques travailleurs, puis se termine. Comme Docker ne surveille que le PID de la commande initiale, le conteneur s'arrête alors.

Comment empêcher le conteneur de s'arrêter ? J'ai besoin de pouvoir lui dire de se lier au premier processus enfant, ou d'empêcher le processus initial de Nginx de se terminer.

8voto

Nitb Points 97

Pour ajouter les réponses de Tomer et Charles,

Syntaxe pour exécuter nginx au sol dans un conteneur Docker en utilisant Entrypoint :

ENTRYPOINT nginx -g 'daemon off;' 

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

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

7voto

creack Points 11635

Voici un exemple de fichier Docker qui exécute nginx. Comme l'a mentionné Charles, il utilise le daemon off configuration :

https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17

4voto

Pour tous ceux qui viennent ici pour essayer d'exécuter une image nginx dans un docker qui fonctionnera comme un service

Comme il n'y a pas de Dockerfile complet, voici le mien Dockerfile résoudre le problème.

Sympathique et fonctionnel. Merci à toutes les réponses ici afin de résoudre le problème final de 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;'

Et l'exécuter avec :

docker run -p 80:80 -p 443:443 -dit

2voto

Kunthar Points 73

Il est également judicieux d'utiliser supervisord ou runit[1] pour la gestion des services.

[1] https://github.com/phusion/baseimage-docker

0voto

Yorkshire SA Points 11

Dans les notes officielles de l'image officielle de NGINX sur DockerHub, il est indiqué :

Si vous ajoutez un CMD personnalisé dans le Dockerfile, assurez-vous d'inclure -g daemon off; dans le CMD afin que nginx reste au premier plan, afin que Docker puisse suivre le processus correctement (autrement votre conteneur s'arrêtera immédiatement après son démarrage) !

Cela me fait penser que la suppression de CMD [] pourrait empêcher ce problème de se produire en premier lieu ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X