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]
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.
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.
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
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.