web-dev-qa-db-fra.com

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

Nginx est installé sur un conteneur Docker et j'essaye de l'exécuter comme suit:

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

Le problème est que Nginx fonctionne de la manière suivante: le processus initial génère immédiatement un processus principal Nginx et certains travailleurs, puis se ferme. Comme Docker surveille uniquement le PID de la commande d'origine, le conteneur s'arrête alors.

Comment puis-je empêcher le conteneur de s'arrêter? Je dois pouvoir lui dire de se lier au premier processus enfant ou d'empêcher le processus initial de Nginx de quitter.

80
Seldo

nginx, comme tous les programmes bien conçus, peut être configuré pour ne pas démonaliser.

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

115
Charles Duffy

Pour développer la réponse de Charles Duffy, Nginx utilise la directive daemon off pour s’exécuter au premier plan. S'il est gênant de mettre cela 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 (au premier plan) et passe directement au mode de 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
111
johntellsall

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

CMD ["nginx", "-g", "daemon off;"]
34
Tomer Ben David

Ajouter cette commande à Dockerfile peut la désactiver:

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

Ici, vous avez un exemple de fichier Docker qui exécute nginx. Comme mentionné par Charles, il utilise la configuration daemon off:

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

5
creack

C'est également une bonne idée d'utiliser supervisord ou runit [1] pour la gestion des services.

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

3
Kunthar

Pour ajouter Tomer et Charles, 

Syntaxe pour exécuter nginx au premier plan dans le conteneur Docker à l'aide de 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;' 
0
Nitb