web-dev-qa-db-fra.com

Nginx docké ne démarre pas

J'ai essayé de suivre des didacticiels et de la documentation sur la dockérisation de mon serveur Web, mais j'ai du mal à exécuter le service via la commande docker run.

Voici mon Dockerfile:

FROM ubuntu:trusty

#Update and install stuff
RUN apt-get update
RUN apt-get install -y python-software-properties aptitude screen htop nano nmap nginx

#Add files
ADD src/main/resources/ /usr/share/nginx/html

EXPOSE 80
CMD service nginx start

Je crée mon image:

docker build -t myImage .

Et quand je le lance:

docker run -p 81:80 myImage

il semble que ça s'arrête:

docker ps -a

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
90e54a254efa        pms-gui:latest      /bin/sh -c service n   3 seconds ago       Exit 0                                  prickly_bohr

Je m'attendrais à ce que cela fonctionne avec le port 81-> 80, mais ce n'est pas le cas. Fonctionnement

docker start 90e

ne semble rien faire.

J'ai aussi essayé de le saisir directement

docker run -t -i -p 81:80 myImage /bin/bash

et à partir d'ici je peux démarrer le service

service nginx start

et d'un autre onglet, je peux voir qu'il fonctionne comme prévu (également dans mon navigateur):

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
408237a5e10b        myImage:latest      /bin/bash           12 seconds ago      Up 11 seconds       0.0.0.0:81->80/tcp   mad_turing 

Je suppose donc que je fais quelque chose de mal avec mon Dockerfile? Quelqu'un pourrait-il m'aider avec cela, je suis tout à fait nouveau à Docker. Merci!

SOLUTION: Sur la base de la réponse d'Ivant, j'ai trouvé une autre façon de démarrer nginx au premier plan. Mon Dockerfile CMD ressemble maintenant à:

CMD /usr/sbin/nginx -g "daemon off;"
34
Solvemon

À partir de maintenant, l'image officielle de nginx l'utilise pour exécuter nginx (voir le Dockerfile ):

CMD ["nginx", "-g", "daemon off;"]

Dans mon cas, cela a suffi pour qu'il démarre correctement. Il existe des tutoriels en ligne suggérant des moyens plus maladroits pour y parvenir, mais ce qui précède semble assez clair.

71
Ben Creasy

Le conteneur Docker s'exécute tant que la commande que vous spécifiez avec CMD, ENTRTYPOINT ou via la ligne de commande est en cours d'exécution. Dans votre cas, la commande service se termine immédiatement et le conteneur entier est arrêté.

Une façon de résoudre ce problème consiste à démarrer nginx directement à partir de la ligne de commande (assurez-vous de ne pas l'exécuter en tant que démon).

Une autre option consiste à créer un petit script qui démarre le service, puis s'endort pour toujours. Quelque chose comme:

#!/bin/bash
service nginx start
while true; do sleep 1d; done

et exécutez ceci au lieu d'exécuter directement la commande service.

Une troisième option serait d'utiliser quelque chose comme runit ou un programme similaire, au lieu du service normal.

23
ivant

Utilisation de docker-compose:

Pour suivre la solution recommandée, ajoutez à docker-compose.yml:

command: nginx -g "daemon off"

J'ai également trouvé que je pouvais simplement ajouter à nginx.conf:

daemon off;

... et continuez à utiliser dans docker-compose.yml:

command: service nginx start

... bien que cela rendrait le fichier de configuration moins portable en dehors du docker.

7
macsteps

Docker comme un très bel index d'images officielles et utilisateur. Lorsque vous voulez faire quelque chose, il y a de fortes chances que quelqu'un l'ait déjà fait;)

Recherchez simplement 'nginx' sur index.docker.io, vous verrez, il y a une image officielle de nginx: https://registry.hub.docker.com/_/nginx/

Là, vous avez un guide complet pour vous aider à démarrer votre serveur Web.

N'hésitez pas à jeter un œil à l'image nginx des autres utilisateurs pour voir les variantes :)

L'idée est de démarrer nginx en mode premier plan.

4
creack