EXEC
← Retour aux diaporamas
Maintenance et opérations

Entrer dans un conteneur Docker en cours d'exécution

Quand un conteneur tourne mais ne se comporte pas comme prévu, il faut souvent ouvrir un shell à l'intérieur pour inspecter les fichiers, lire les logs internes ou tester une commande. La bonne façon est docker exec et non docker attach. Voici la procédure et les pièges à éviter.

1 Quand entrer dans un conteneur

Un conteneur n'est pas une boite noire. Tant qu'il est en cours d'exécution, on peut y ouvrir un shell pour observer ce qui s'y passe sans l'arrêter ni le reconstruire. Quatre situations classiques :

Vérifier un fichier
S'assurer que la configuration copiée par le Dockerfile est bien en place, ou que le volume monté contient les bonnes données.
Lire des logs internes
Quand l'application n'écrit pas sur la sortie standard, ses journaux restent à l'intérieur du conteneur, par exemple dans /var/log/.
Tester une commande
Vérifier qu'un outil est installé, qu'un service écoute sur un port, qu'une variable d'environnement est bien définie.
Diagnostiquer le réseau
Tester depuis l'intérieur si le conteneur peut joindre un autre service du même réseau Docker, par exemple une base de données.

2 La commande clé : docker exec

La commande standard pour ouvrir un shell dans un conteneur en marche est :

docker exec -it nom-du-conteneur bash
Décortiquer la commande
  • exec lance une nouvelle commande à l'intérieur d'un conteneur déjà démarré, sans interférer avec son processus principal.
  • -i (interactive) garde la sortie standard ouverte pour vous laisser taper.
  • -t (tty) attache un pseudo-terminal pour que le shell se comporte normalement (couleurs, complétion, retour à la ligne).
  • bash est la commande à exécuter, ici un shell. Sur les images minimalistes, ce sera sh.

3 Procédure pas à pas

1
Identifier le conteneur
Lister les conteneurs en cours d'exécution pour récupérer leur nom ou leur identifiant.
docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED       STATUS        PORTS                  NAMES
a3f2b9c1d4e7   httpd:alpine    "httpd-foreground"  3 hours ago   Up 3 hours   0.0.0.0:8080->80/tcp  site-de-cours
La dernière colonne donne le nom (ici site-de-cours). Ce nom est plus pratique que l'identifiant et reste stable tant que le conteneur n'est pas recréé.
2
Ouvrir un shell à l'intérieur
Lancer docker exec avec le nom récupéré. L'invite change pour signaler que vous êtes maintenant dans le conteneur.
docker exec -it site-de-cours bash
root@a3f2b9c1d4e7:/usr/local/apache2# # vous etes a l'interieur
Comment reconnaitre l'invite
L'invite affiche l'identifiant court du conteneur (ici a3f2b9c1d4e7) au lieu du nom de votre machine. Si vous voyez votre nom d'utilisateur habituel, vous etes encore sur l'hote.
3
Inspecter, lire, tester
Vous etes dans un environnement Linux minimal. Les commandes habituelles fonctionnent, mais beaucoup d'outils manquent souvent (pas de vim, pas de curl, pas de ps). Quelques exemples utiles :
ls /usr/local/apache2/htdocs/
cat /etc/hostname
env | sort
Le premier vérifie ce que sert vraiment Apache, le deuxième confirme que l'invite affiche bien l'identifiant du conteneur, le troisième dévoile les variables d'environnement vues par le processus.
4
Sortir sans tuer le conteneur
Pour quitter, tapez simplement :
exit
Pourquoi c'est sans danger
exit ferme uniquement le shell bash que vous aviez lancé via exec. Le processus principal du conteneur (Apache, dans cet exemple) continue de tourner. Vous pouvez le confirmer avec docker ps en revenant sur l'hôte.

4 Pièges courants et alternatives

Piège 1 - bash n'existe pas
OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown

Beaucoup d'images minimalistes (Alpine, distroless, scratch) n'embarquent pas bash. Essayez sh qui est presque toujours présent :

docker exec -it site-de-cours sh
Piège 2 - confondre exec et attach

docker attach vous branche directement sur le processus principal du conteneur (PID 1), pas sur un nouveau shell. Si vous tapez exit ou Ctrl+C, vous tuez ce processus et donc le conteneur entier. À éviter pour de l'inspection. Pour quitter attach sans rien casser, il faut faire la séquence Ctrl+P puis Ctrl+Q. C'est exactement ce qui rend exec plus sûr au quotidien.

Piège 3 - le conteneur est arrêté

docker exec ne fonctionne que sur un conteneur en cours d'exécution. Si docker ps ne le montre pas, listez aussi les arrêtés avec docker ps -a. Pour inspecter un conteneur mort, deux choix : le redémarrer brièvement avec docker start nom puis exec, ou explorer son système de fichiers figé avec docker cp.

Astuce - exécuter une commande unique
Pas obligé d'ouvrir un shell complet. Pour une seule commande, on peut s'épargner les options interactives :
docker exec site-de-cours cat /etc/hostname
Pratique dans un script de diagnostic ou pour vérifier rapidement un point précis sans rentrer puis ressortir.
Astuce - entrer en tant qu'utilisateur autre que root
Par défaut, exec ouvre le shell avec l'utilisateur défini par l'image (souvent root). Pour entrer comme un utilisateur précis, ajoutez -u :
docker exec -it -u www-data site-de-cours sh
Utile pour reproduire les permissions exactes que voit le serveur web, par exemple lors d'un problème d'accès à un fichier monté en volume.