2.4 Rentrer dans la matrice d'un container
Apprendre à interagir avec un conteneur en cours d'exécution.
Rentrer dans la matrice : la commande docker exec
Une fois que votre conteneur tourne, vous aurez souvent besoin d'interagir avec lui : vérifier qu'un fichier a bien été créé, lire le contenu d'un dossier de logs, ou tout simplement lancer un script à l'intérieur.
Pour ça, il existe une commande reine : docker exec. Elle permet tout simplement d'exécuter une commande à l'intérieur d'un conteneur spécifique qui est déjà en cours d'exécution.
1. Lancer une commande unique (le "One-shot")
Imaginez que vous vouliez juste lister les fichiers à la racine de votre serveur Nginx. Vous pouvez envoyer la commande ls -l directement au conteneur.
Voyons ce que ça donne avec notre Nginx. D'abord, on liste nos conteneurs pour récupérer l'ID :
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7fb193e99619 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp mon_premier_site
Maintenant, on envoie notre commande ls -l à ce conteneur précis :
➜ ~ docker exec 7fb193e99619 ls -l
total 64
lrwxrwxrwx 1 root root 7 Jul 4 09:05 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Jul 4 09:05 boot
drwxr-xr-x 5 root root 340 Jul 28 10:12 dev
drwxr-xr-x 1 root root 4096 Jul 28 10:12 etc
drwxr-xr-x 2 root root 4096 Jul 4 09:05 home
# ... (le reste des dossiers système s'affiche) ...
7fb193e99619), s'y est infiltré une fraction de seconde pour exécuter ls -l, nous a renvoyé le résultat dans notre terminal, puis est ressorti. Efficace et rapide !2. Garder la porte ouverte : le mode interactif
C'est très pratique pour une seule commande, mais si on veut fouiller un peu plus, taper docker exec à chaque fois devient vite lourd.
On peut aller beaucoup plus loin en utilisant le flag -it (qui signifie Interactif + allocation d'un TTY). Ce flag permet de créer un "tunnel" maintenu ouvert entre notre terminal et le conteneur. On va l'associer à l'ouverture d'un interpréteur de commandes, comme bash (ou sh).
➜ ~ docker exec -it 7fb193e99619 bash
root@7fb193e99619:/#
➜ ~ à root@7fb193e99619:/#. Cela signifie que vous êtes littéralement connecté en direct à l'intérieur de votre conteneur, avec les droits root (administrateur). C'est exactement comme si vous étiez connecté en SSH sur un serveur distant !Vous pouvez taper toutes vos commandes (ls, cd, cat) de manière successive. Une fois que vous avez fini votre investigation, il suffit de taper exit pour quitter le conteneur et revenir à votre PC.
3. Les options utiles pour aller plus loin
Il existe plusieurs options super intéressantes pour chaîner les comportements avec docker exec :
-it: Lance le terminal en mode interactif.bashoush: C'est le programme qu'on lance à l'intérieur. Attention, les images très légères (comme Alpine Linux) n'ont pasbashinstallé. Dans ce cas, on utilise toujourssh.-u(User) : Permet de choisir un utilisateur spécifique au lieu du compteroot. C'est une excellente pratique de sécurité pour tester les droits d'un dossier par exemple.-d(Detach) : Exécute une commande en arrière-plan sans bloquer votre terminal (utile pour lancer un script de nettoyage silencieux dans le conteneur).-w(Workdir) : Permet de spécifier dans quel dossier la commande doit s'exécuter.-e(Env) : Permet de passer une variable d'environnement temporaire juste pour cette commande.
Quelques exemples concrets pour la route :
Ouvrir un shell sur une image légère (qui n'a pas bash) :
docker exec -it mon_container sh
Lancer un script en tâche de fond, sans bloquer le terminal :
docker exec -d mon_container python script_de_fond.py
Se connecter en tant qu'utilisateur "debian" pour des raisons de sécurité :
docker exec -u debian -it mon_container bash
Exécuter une commande directement dans un dossier spécifique (ici /app) :
docker exec -w /app mon_container ls -l
Ici, le script Python aura accès à la variable APP_ENV avec la valeur development uniquement le temps de son exécution.
docker exec -e APP_ENV=development mon_container python script.py
exec, dans la vraie vie, tu vas utiliser le flag -e à 90 % du temps quand on crées ton conteneur avec docker run.C'est d'ailleurs obligatoire pour des images comme MySQL qui exigent un mot de passe administrateur pour démarrer :docker run -d -e MYSQL_ROOT_PASSWORD=mon_super_mot_de_passe --name ma_base_de_donnees mysql:8.0
L'astuce
Tu peux mettre autant de flags -e que tu veux dans une seule commande si tu as plusieurs variables à passer : docker run -e USER=dylan -e ROLE=admin -e THEME=dark mon_image