Avez-vous déjà eu besoin de voir ce qui se passe à l'intérieur d'un conteneur Docker ? Les conteneurs sont destinés à être idempotents :en cas de problème, redéployez un nouveau conteneur. Souvent la vie n'est pas si simple. Vous devez exécuter des commandes dans le conteneur pour identifier le problème. C'est là que le docker exec
commande peut aider.
Cet article vous apprendra comment exécuter des commandes sur un conteneur Docker en cours d'exécution à l'aide de docker exec
commande.
Prérequis
Pour suivre les exemples de cet article, vous devrez respecter les points suivants.
- Toute version récente de Docker Desktop fonctionnera sous Windows, Linux ou macOS. Ce didacticiel utilise la v3.1.0 exécutée sur Windows 10.
Démarrer un conteneur NGINX
Docker exec
exécute des commandes dans des conteneurs. Mais, pour ce faire, vous devez d'abord disposer d'un conteneur dans lequel 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é dockerfile (sans extension), contenant le code suivant. Le Dockerfile définit les étapes nécessaires pour créer un conteneur.
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
3. Ensuite, créez un fichier, dans le même répertoire, nommé index.html qui contient le code suivant. Il s'agit d'un fichier HTML qui, au démarrage du conteneur, affichera un message Hello World.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello World - Nginx Docker</title>
<style>
h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif;
}
</style>
</head>
<body>
<h1>
Hello World
</h1>
</body>
</html>
4. Créez maintenant le conteneur Nginx Docker. Étant donné que le Dockerfile se trouve dans le répertoire de travail actuel, spécifiez .
pour faire savoir au moteur Docker qu'il doit y regarder. Assurez-vous également de baliser le conteneur avec my-ngnix
en utilisant le t
paramètre pour assurer une référence plus facile à l'avenir.
docker build -t my-nginx .
5. Maintenant que le conteneur est construit, démarrez le conteneur avec la commande Docker run.
# rm - Informs Docker to delete the container after it has stopped
# d - Return control of the command-line after the command has been executed
# p - Map the internal container port 80 to an external port 80 docker run --rm -d -p 80:80 my-nginx
6. Enfin, ouvrez votre navigateur Web et accédez à http://localhost/
pour voir la suite.
Exécuter des commandes avec Docker Exec
Lors de l'exécution de commandes dans un conteneur Docker, vous devrez peut-être exécuter une commande de manière interactive. Exécuter des commandes de manière interactive signifie saisir une commande, obtenir des commentaires, saisir une autre commande, etc. Les commandes interactives prennent le contrôle de votre session et vous empêchent de faire quoi que ce soit d'autre.
Mais que se passe-t-il si vous connaissez déjà les commandes à envoyer au conteneur à l'avance et que vous souhaitez exécuter des commandes 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 reprendre 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 du conteneur. Avant d'exécuter une commande, recherchez le nom ou l'ID du conteneur NGINX. Le nom ou l'ID fonctionnera dans les commandes Docker. Dans cet esprit, se souvenir de l'ID peut être plus difficile que le nom !
Pour afficher toutes les informations de conteneur en cours d'exécution, exécutez le Docker ps
commande pour afficher les informations suivantes.
docker ps
Copiez soit l'ID unique, e17e4b6be01a
, ou le nom généré aléatoirement mystifying_chandrasekhar
dans votre presse-papiers pour une utilisation ultérieure.
Exécuter une commande non interactive avec Docker Exec
Comme exemple d'exécution d'une commande non interactive, copiez et exécutez la commande ci-dessous pour renvoyer une liste de fichiers dans /var/log répertoire avec le ls -l
commande. Passez tout après le nom du conteneur, mystifying_chandrasekhar
, au Docker exec
commande.
docker exec mystifying_chandrasekhar ls -l /var/log
Éviter la sortie de la console avec les commandes Docker
En rendant instantanément le contrôle du shell à l'utilisateur, les opérations importantes évitent de bloquer la console. Renoncez à la sortie de la console avec le d
détaché option. La commande ci-dessous crée le fichier /tmp/execWorks via le touch
commande dans le conteneur et n'affiche aucune sortie sur la console.
docker exec -d mystifying_chandrasekhar touch /tmp/execWorks
Exécuter des commandes interactives avec Docker Exec
Jusqu'à présent, vous avez appris à exécuter des commandes non interactives dans un conteneur Docker avec docker exec
. Cependant, vous pouvez être confronté à un moment 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 les commandes de manière interactive.
Exécuter des commandes de manière interactive avec docker exec
nécessite deux options, i
et t
. Le i
l'option garde STDIN ouvert, permettant aux commandes d'être envoyées au conteneur, et le t
L'option alloue un pseudo-TTY (PTY), un canal de communication, pour saisir des commandes.
Copiez et collez la commande suivante pour ouvrir une invite de commande interactive dans le conteneur Docker en cours d'exécution avec le shell Bourne (sh), comme indiqué par le changement d'invite en / #
.
docker exec -it mystifying_chandrasekhar sh
Une fois dans le shell, exécutez maintenant les commandes ci-dessous pour montrer la liste des fichiers à partir du conteneur. Enfin, en exécutant la exit
commande pour quitter le shell interactif.
ls -l /var/log
exit
Pour ouvrir une invite interactive dans un répertoire spécifique, transmettez le chemin d'accès au
w
option indiquant à Docker de démarrer le shell dans un répertoire spécifié.
Passer 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 le JAVA_HOME
variable d'environnement à définir sur le chemin Java.
Vous pouvez passer des variables d'environnement à une session en utilisant le e
option. Par exemple, vous devez peut-être remplir une variable d'environnement appelée MYVAR
dans un conteneur en cours d'exécution. Pour ce faire, utilisez le e
option et fournissez la paire clé/valeur de MYVAR="<some value>"
comme indiqué ci-dessous.
docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Passer 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 le --env-file
option. Cette technique est souvent utilisée pour fournir des informations d'identification sécurisées à un conteneur. Assurez-vous de ne jamais valider les informations d'identification dans le contrôle de version !
Créez un fichier texte nommé env-vars.txt
avec les variables d'environnement à passer et leurs valeurs. Ce fichier peut s'appeler comme vous voulez et n'a pas besoin du .txt
extension de fichier.
Passez les variables d'environnement à Docker avec le env-file
option. Vérifiez que les variables sont disponibles avec le echo
commande comme indiqué dans la capture d'écran ci-dessous.
# Pass the env-vars.txt file and open an interactive prompt
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Verify that the environmental variables are available in the Docker container
echo $MYVAR
echo $FOO
echo $SOMETHING
Interagir avec un conteneur en cours d'exécution en tant qu'utilisateur différent
En production, les applications s'exécutent souvent en tant qu'utilisateur spécifique pour restreindre leur accès. Si vous exécutez des applications en tant qu'utilisateur spécifique en production, vous devez également le faire lors du test des commandes.
Dans cet exemple, le conteneur Docker est exécuté en tant que nginx
utilisateur. Passer l'utilisateur au w
option pour indiquer à Docker de démarrer le conteneur en tant que nginx
Compte. Le whoami
La commande, exécutée depuis le conteneur, confirme que le nginx
user est bien utilisé.
docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Étapes suivantes
Vous avez appris à exécuter des commandes dans un conteneur en cours d'exécution à l'aide de docker exec
commande. Utilisation de exec
pour entrer et interroger les conteneurs en cours d'exécution, vous disposez d'un nouvel outil puissant dans votre arsenal pour dépanner les conteneurs Docker.
Maintenant, essayez d'aller plus loin dans 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 est nouveau pour vous, l'article Guide du débutant sur Visual Studio Code et Git est un excellent point de départ.