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.
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 .
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
Pour développer la réponse de John, vous pouvez également utiliser la commande Dockerfile
CMD
comme suit (au cas où vous voudriez qu'elle démarre automatiquement sans arguments supplémentaires)
CMD ["nginx", "-g", "daemon off;"]
Ajouter cette commande à Dockerfile peut la désactiver:
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
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
C'est également une bonne idée d'utiliser supervisord ou runit [1] pour la gestion des services.
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;'