web-dev-qa-db-fra.com

Le conteneur nginx personnalisé se ferme immédiatement lorsqu'une partie de docker-compose

J'essaie d'apprendre à utiliser docker compose avec une configuration simple d'un conteneur nginx qui redirige les requêtes vers un conteneur fantôme. J'utilise l'image fantôme standard mais j'ai une image nginx personnalisée (qui hérite de l'image standard).

Lorsque j'exécute la composition à l'aide de "docker-compose up", elle se termine immédiatement avec "docker_nginx_1 sortie avec le code 0". Cependant, lorsque je le crée et l'exécute manuellement, il fonctionne correctement et je peux naviguer dans mon navigateur vers le conteneur et afficher la page nginx par défaut. Qu'est-ce que je comprends mal de mon fichier de composition qui fait qu'il se comporte différemment de sa création personnalisée? Que puis-je changer pour qu'il continue de fonctionner?

Avertissement: j'apprends également nginx au fur et à mesure, donc apprendre deux choses à la fois peut me causer des problèmes indus.

EDIT: Les fichiers d'origine étaient un peu plus complexes, mais j'ai réduit le problème à simplement: si j'utilise la commande build pour une image personnalisée qui ne fait rien mais hérite de l'image nginx par défaut, elle se ferme immédiatement. Si j'utilise l'image nginx par défaut, cela fonctionne. Voici les fichiers désormais pertinents:

Composez le fichier:

ghost:
 expose:
   - "2368"
 image: ghost

nginx:
  # image: nginx << If I use this instead of my custom build, it doesn't exit
  build: ./nginx
  ports:
    - "80:80"
    - "443:443"
  links:
   - ghost

nginx/Dockerfile:

FROM nginx

FICHIERS ORIGINAUX (avec le même fichier de composition que ci-dessus):

nginx/Dockerfile:

FROM nginx
RUN rm /etc/nginx/nginx.conf
COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY conf/sites-available/ghost /etc/nginx/sites-available/ghost
RUN mkdir /etc/nginx/sites-enabled
RUN ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost

EXPOSE 80 443

# Is this even the right command I have no idea

CMD service nginx start

nginx/conf/nginx.conf:

daemon off;

user  nginx;
# Let nginx figure out the processes I guess
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

nginx/conf/sites disponibles/fantôme

server {
  listen 80;
  server_name 127.0.0.1;
  access_log /var/log/nginx/localhost.log;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_Host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://0.0.0.0:2368;
    proxy_redirect off;
  }
}

Exécution de la composition:

plays-MacBook-Pro:docker play$ docker-compose up
Creating docker_ghost_1...
Creating docker_nginx_1...
Attaching to docker_ghost_1, docker_nginx_1
docker_nginx_1 exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
Stopping docker_ghost_1... done

Exécution manuelle:

plays-MacBook-Pro:nginx play$ docker build --no-cache -t nginx_custom .
Sending build context to Docker daemon 8.704 kB
Step 0 : FROM nginx
 ---> 914c82c5a678
Step 1 : RUN rm /etc/nginx/nginx.conf
 ---> Running in 4ce9de96bb36
 ---> 98f97a9da4fc
Removing intermediate container 4ce9de96bb36
Step 2 : ADD conf/nginx.conf /etc/nginx/nginx.conf
 ---> dd3e089208a9
Removing intermediate container 36b9a47e0806
Step 3 : ADD conf/sites-available/ghost /etc/nginx/sites-available/ghost
 ---> 55fae53e5810
Removing intermediate container a82741d24af4
Step 4 : RUN mkdir /etc/nginx/sites-enabled
 ---> Running in 7659ead01b7b
 ---> 406be1c42394
Removing intermediate container 7659ead01b7b
Step 5 : RUN ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost
 ---> Running in e9658a08affa
 ---> 021a84216e8a
Removing intermediate container e9658a08affa
Step 6 : EXPOSE 80 443
 ---> Running in 230e4523794c
 ---> 23d85e1a04cb
Removing intermediate container 230e4523794c
Step 7 : CMD service nginx start
 ---> Running in 209e129cae21
 ---> d7004d6fa223
Removing intermediate container 209e129cae21
Successfully built d7004d6fa223
plays-MacBook-Pro:nginx play$ docker run -t nginx_custom
[It sits here on an empty line, running in the background]
19
Merrillogic

Je viens de rencontrer ce même problème, et le premier correctif devait changer le nom du service dans docker-compose.yml.

Cela a fonctionné, mais la raison que cela a fonctionné est que Docker-compose met en cache la génération et le lie au nom du service. Chaque docker-compose up après le premier utilise juste ce qu'il a construit avant, donc toutes les modifications que vous apportez au Dockerfile, ou à cette section du docker-compose.yml sont fondamentalement ignorés.

Lorsque vous (et moi) avons modifié le nom du service, cela a déclenché une nouvelle génération car ce nom de service n'a pas été balisé auparavant.

La vraie solution consiste à: build docker-compose pour reconstruire l'image (suivie d'un docker-compose up). Leur documentation ne met pas vraiment l'accent sur ce problème.

21
Gerrat

Le CMD de votre Dockerfile doit démarrer un processus qui doit s'exécuter au premier plan. La commande service nginx start exécute le processus en mode démon et donc votre conteneur se ferme proprement car la commande service se ferme.

Utilisez le suivant CMD ["nginx", "-g", "daemon off;"] pour démarrer nginx (tiré de image officielle ) et cela devrait fonctionner correctement.

29
michal kralik

Vous pouvez également ajouter un

tty: true

au service dans votre docker-compose.yml:

webserver:
    build: .
    volumes:
        - "./src:/var/www/html"
    ports:
        - 8080:80
    depends_on:
        - aap-mysql
    tty: true

et il devrait continuer à fonctionner après

docker-compose up
11
Bernhard Zürn

J'ai compris ce que c'était. J'avais besoin de nommer la partie nginx de ma composition autre chose que "nginx". Je ne sais pas si c'est parce qu'il y a déjà une image nginx ou si c'est autre chose, mais le changer l'a fait fonctionner correctement.

En changeant mon fichier de composition en:

ghost:
 expose:
   - "2368"
 image: ghost

mything:
  # image: nginx
  build: ./nginx
  ports:
    - "80:80"
    - "443:443"
  links:
   - ghost

J'ai pu le faire fonctionner. Un indicateur était que lorsque le nom a changé, j'ai en fait vu la sortie du processus de construction pour mon conteneur. Si quelqu'un sait exactement pourquoi la dénomination doit être ainsi, j'aimerais savoir.

5
Merrillogic