Voici quelques méthodes différentes...
A) Utiliser docker exec (le plus simple)
Docker version 1.3 ou plus récente prend en charge la commande exec
qui se comportent comme nsenter
. Cette commande peut exécuter un nouveau processus dans un conteneur déjà en cours d'exécution (le conteneur doit déjà avoir le processus PID 1 en cours d'exécution). Vous pouvez exécuter /bin/bash
pour explorer l'état du conteneur :
docker exec -t -i mycontainer /bin/bash
voir la documentation de la ligne de commande Docker
B) Utiliser l'instantané
Vous pouvez évaluer le système de fichiers du conteneur de cette façon :
# find ID of your running container:
docker ps
# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot
# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash
De cette façon, vous pouvez évaluer le système de fichiers du conteneur en cours d'exécution au moment précis. Le conteneur est toujours en cours d'exécution, aucune modification future n'est incluse.
Vous pouvez ensuite supprimer l'instantané en utilisant (le système de fichiers du conteneur en cours d'exécution n'est pas affecté !) :
docker rmi mysnapshot
C) Utiliser ssh
Si vous avez besoin d'un accès continu, vous pouvez installer sshd sur votre conteneur et exécuter le démon sshd :
docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
# you need to find out which port to connect:
docker ps
De cette façon, vous pouvez exécuter votre application en utilisant ssh (connectez-vous et exécutez ce que vous voulez).
D) Utiliser nsenter
Utilisez nsenter
, consultez Pourquoi vous n'avez pas besoin d'exécuter SSHd dans vos conteneurs Docker
La version courte est :avec nsenter, vous pouvez obtenir un shell dans un conteneur existant, même si ce conteneur n'exécute pas SSH ou tout autre type de démon à usage spécial
MISE À JOUR :EXPLORATION !
Cette commande devrait vous permettre d'explorer un conteneur docker en cours d'exécution :
docker exec -it name-of-container bash
L'équivalent de ceci dans docker-compose serait :
docker-compose exec web bash
(web est le nom du service dans ce cas et il a tty par défaut.)
Une fois à l'intérieur, faites :
ls -lsa
ou toute autre commande bash comme :
cd ..
Cette commande devrait vous permettre d'explorer une image docker :
docker run --rm -it --entrypoint=/bin/bash name-of-image
une fois à l'intérieur faites :
ls -lsa
ou toute autre commande bash comme :
cd ..
Le -it
signifie interactif... et tty.
Cette commande devrait vous permettre d'inspecter un conteneur ou une image Docker en cours d'exécution :
docker inspect name-of-container-or-image
Vous voudrez peut-être le faire et découvrir s'il y a un bash
ou sh
là-dedans. Recherchez entrypoint ou cmd dans le retour json.
REMARQUE : Cette réponse repose sur la présence de l'outil commen, mais s'il n'y a pas de bash
shell ou des outils communs comme ls
présent, vous pouvez d'abord en ajouter un dans une couche si vous avez accès au Dockerfile
:exemple pour alpin :
RUN apk add --no-cache bash
Sinon si vous n'avez pas accès au Dockerfile
puis copiez simplement les fichiers hors d'un conteneur nouvellement créé et parcourez-les en faisant :
docker create <image> # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah
voir la documentation de docker exec
voir la documentation de docker-compose exec
voir la documentation d'inspection de docker
voir la documentation de création de docker
Dans le cas où votre conteneur est arrêté ou n'a pas de shell (par exemple hello-world
mentionné dans le guide d'installation, ou non alpine
traefik
), c'est probablement la seule méthode possible pour explorer le système de fichiers.
Vous pouvez archiver le système de fichiers de votre conteneur dans un fichier tar :
docker export adoring_kowalevski > contents.tar
Ou listez les fichiers :
docker export adoring_kowalevski | tar t
Notez que selon l'image, cela peut prendre du temps et de l'espace disque.