Docker Exec : Votre Commande de Prédilection pour Exécuter des Commandes dans Docker


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.

  1. 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, lorsque le conteneur est démarré, 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. 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.

docker build -t my-nginx .
Creating a Docker container with the build command.

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

# rm - Informe Docker de supprimer le conteneur après qu'il s'est arrêté 
# d - Rend le contrôle de la ligne de commande après que la commande a été exécutée 
# p - Mappe le port interne du conteneur 80 vers un port externe 80 docker run --rm -d -p 80:80 my-nginx
Start the container with the Docker run command.

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

Output of the running NGINX container.

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.

docker ps
Displaying running Docker containers.

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.

docker exec mystifying_chandrasekhar ls -l /var/log
Executing a directory listing within the NGINX container.

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

docker exec -d mystifying_chandrasekhar touch /tmp/execWorks

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 / #.

docker exec -it mystifying_chandrasekhar sh
Running an interactive Docker shell.

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.

ls -l /var/log
exit
Open an interactive command prompt to the container.

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.

docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Pass environment variables

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.

Text file with environmental variables defined.

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.

# Passez le fichier env-vars.txt et ouvrez un invite interactif
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Vérifiez que les variables d'environnement sont disponibles dans le conteneur Docker
echo $MYVAR
echo $FOO
echo $SOMETHING
Passing a environmental variables file to Docker and verifying the environment variables exist in the container.

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

docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Running the container as the 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.

Source:
https://adamtheautomator.com/docker-exec/