Avez-vous déjà eu besoin de voir ce qui se passe à l’intérieur d’un conteneur Docker? Les conteneurs sont censés être idempotents : en cas de problème, redéployez un nouveau conteneur. Souvent, la vie n’est pas aussi simple. Vous devez exécuter des commandes dans le conteneur pour identifier le problème. C’est là que la commande docker exec
peut vous aider.
Cet article vous apprendra comment exécuter des commandes sur un conteneur Docker en cours d’exécution à l’aide de la commande docker exec
.
Prérequis
Pour suivre les exemples de cet article, vous devrez respecter les points suivants.
- N’importe quelle version récente de Docker Desktop fonctionnera sur Windows, Linux ou macOS. Ce tutoriel utilise la version 3.1.0 exécutée sur Windows 10.
Démarrer un conteneur NGINX
docker exec
exécute des commandes dans les conteneurs. Mais, pour cela, vous devez d’abord avoir un conteneur pour exécuter ces commandes. Commençons par télécharger une image Docker et créer un conteneur de démonstration.
- Créez un nouveau répertoire, ce tutoriel utilise C:\gitrepos\test, pour contenir les fichiers utilisés pour le conteneur.
2. Créez un fichier nommé
3. Ensuite, créez un fichier, dans le même répertoire, nommé
4. Maintenant, créez le conteneur Docker Nginx. Comme le Dockerfile est dans le répertoire de travail actuel, spécifiez .
pour indiquer au moteur Docker de rechercher à cet endroit. Assurez-vous également d’étiqueter le conteneur avec my-nginx
en utilisant le paramètre t
pour faciliter la référence ultérieure.

5. Maintenant que le conteneur est construit, démarrez le conteneur avec la commande Docker run.

6. Enfin, ouvrez votre navigateur web et accédez à http://localhost/
pour voir ce qui suit.

Exécution des commandes avec Docker Exec
Lors de l’exécution de commandes dans un conteneur Docker, il peut être nécessaire d’exécuter une commande de manière interactive. Exécuter des commandes de manière interactive signifie taper une commande, obtenir des retours, taper une autre commande, etc. Les commandes interactives prennent le contrôle de votre session et vous empêchent de faire autre chose.
Mais que faire si vous connaissez déjà les commandes à envoyer au conteneur à l’avance et que vous souhaitez les exécuter en arrière-plan ? Dans ce cas, vous pouvez exécuter des commandes non interactives. Les commandes non interactives vous permettent d’envoyer une commande à Docker et de récupérer instantanément le contrôle de la console.
Localisation du nom et de l’ID du conteneur
Maintenant que vous avez construit le conteneur, vous pouvez exécuter des commandes à l’intérieur de celui-ci. Avant d’exécuter une commande, localisez le nom ou l’ID du conteneur NGINX. Le nom ou l’ID fonctionnera dans les commandes Docker. Cependant, se rappeler de l’ID peut être plus difficile que le nom!
Pour afficher des informations sur n’importe quel conteneur en cours d’exécution, exécutez la commande Docker ps
pour afficher les informations suivantes.

Copiez soit l’ID unique, e17e4b6be01a
, soit le nom généré aléatoirement mystifying_chandrasekhar
dans votre presse-papiers pour une utilisation ultérieure.
Exécution d’une commande non interactive avec Docker Exec
À titre d’exemple d’exécution d’une commande non interactive, copiez et exécutez la commande ci-dessous pour afficher une liste de fichiers dans le répertoire /var/log avec la commande ls -l
. Passez tout après le nom du conteneur, mystifying_chandrasekhar
, à la commande Docker exec
.

Éviter la sortie de la console avec des commandes Docker
En retournant instantanément le contrôle du shell à l’utilisateur, les opérations volumineuses évitent de monopoliser la console. Renoncez à la sortie de la console avec l’option détachée d
. La commande ci-dessous crée le fichier /tmp/execWorks via la commande touch
à l’intérieur du conteneur et n’affiche aucune sortie sur la console.
Exécution de commandes interactives avec Docker Exec
Jusqu’à présent, vous avez appris comment exécuter des commandes non interactives dans un conteneur Docker avec docker exec
. Cependant, vous pourriez être confronté à une situation où vous devez dépanner un conteneur, par exemple, lorsque vous devez envoyer des commandes au conteneur de manière interactive. Dans ce cas, vous devez exécuter des commandes de manière interactive.
Exécuter des commandes de manière interactive avec docker exec
nécessite deux options, i
et t
. L’option i
maintient l’ouverture de STDIN, permettant l’envoi de commandes au conteneur, et l’option t
alloue un pseudo-terminal (PTY), un canal de communication, pour saisir des commandes.
Copiez et collez la commande suivante pour ouvrir un interpréteur de commandes interactif vers le conteneur Docker en cours d’exécution avec le shell Bourne (sh), comme indiqué par le changement du prompt en / #
.

Une fois dans le shell, exécutez maintenant les commandes ci-dessous pour démontrer la liste des fichiers à l’intérieur du conteneur. Enfin, exécutez la commande exit
pour quitter le shell interactif.

Pour ouvrir un invite de commande interactif dans un répertoire spécifique, passez le chemin à l’option
w
indiquant à Docker de démarrer le shell dans un répertoire spécifié.
Transmettre des variables d’environnement à un conteneur en cours d’exécution
De nombreux programmes utilisent des variables d’environnement pour définir des configurations au démarrage. Par exemple, la plupart des applications Java nécessitent que la variable d’environnement JAVA_HOME
soit définie sur le chemin Java.
Vous pouvez transmettre des variables d’environnement à une session en utilisant l’option e
. Par exemple, peut-être devez-vous peupler une variable d’environnement appelée MYVAR
dans un conteneur en cours d’exécution. Pour ce faire, utilisez l’option e
et fournissez la paire clé/valeur de MYVAR="<some value>"
comme indiqué ci-dessous.

Transmettre des variables d’environnement avec un fichier
Si vous avez de nombreuses variables d’environnement ou une configuration partagée, il peut être plus facile de stocker ces variables dans un fichier. Passez le fichier via un chemin relatif ou absolu à Docker avec l’option --env-file
. Cette technique est souvent utilisée pour fournir des informations d’identification sécurisées à un conteneur. Assurez-vous de ne jamais commettre les informations d’identification dans un contrôle de version!
Créez un fichier texte nommé env-vars.txt
avec les variables d’environnement à transmettre et leurs valeurs. Ce fichier peut être appelé comme vous le souhaitez et n’a pas besoin de l’extension de fichier .txt
.

Transmettez les variables d’environnement à Docker avec l’option env-file
. Vérifiez que les variables sont disponibles avec la commande echo
comme indiqué dans la capture d’écran ci-dessous.

Interagir avec un conteneur en cours d’exécution en tant qu’utilisateur différent
En production, les applications fonctionnent souvent en tant qu’utilisateur spécifique pour restreindre leur accès. Si vous exécutez des applications en production en tant qu’utilisateur spécifique, vous devriez également le faire lors de la test des commandes.
Dans cet exemple, le conteneur Docker est exécuté en tant qu’utilisateur nginx
. Passez l’utilisateur à l’option w
pour indiquer à Docker de démarrer le conteneur en tant que compte nginx
. La commande whoami
, exécutée à partir du conteneur, confirme que l’utilisateur nginx
est effectivement utilisé.

nginx
user.Étapes suivantes
Vous avez appris comment exécuter des commandes dans un conteneur en cours d’exécution en utilisant la commande docker exec
. En utilisant la commande exec
pour entrer et interroger des conteneurs en cours d’exécution, vous disposez d’un nouvel outil puissant dans votre arsenal pour dépanner les conteneurs Docker.
Essayez maintenant d’approfondir ce que vous avez appris et utilisez le contrôle de version Git pour extraire un site Web statique dans le conteneur, plutôt que de copier un seul fichier. Si Git vous est nouveau, alors l’article Guide du débutant de Visual Studio Code et Git est un excellent point de départ.