J'ai remarqué avec Docker que je dois comprendre ce qui se passe à l'intérieur d'un conteneur ou quels fichiers s'y trouvent. Un exemple est le téléchargement d'images à partir de l'index de docker - vous n'avez aucune idée de ce que contient l'image, il est donc impossible de démarrer l'application.
Ce qui serait idéal, c'est de pouvoir y entrer en ssh ou équivalent. Existe-t-il un outil pour le faire, ou ma conceptualisation du docker est-elle erronée en pensant que je devrais être capable de le faire?
linux
docker
filesystems
user2668128
la source
la source
docker exec <container> bash
. Donc, vous venez d'ouvrir un shell à l'intérieur du conteneur.docker exec <container> ls <dir path>
etdocker exec <container> cat <file path>
. Pour bash cependant, ajoutez les-it
options.docker image save image_name > image.tar
comme indiqué dans la réponse de @ Gaurav24.Réponses:
MISE À JOUR
Méthode la plus simple: utiliser docker exec
Docker version 1.3 ou plus récente prend en charge la commande
exec
qui se comporte commensenter
. Cette commande peut exécuter un nouveau processus dans un conteneur déjà en cours d'exécution (le processus PID 1 doit déjà être exécuté sur le conteneur). Vous pouvez exécuter/bin/bash
pour explorer l'état du conteneur:voir la documentation de la ligne de commande Docker
Méthode alternative 1
Instantané
Vous pouvez évaluer le système de fichiers conteneur de cette façon:
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é à l'aide de (le système de fichiers du conteneur en cours d'exécution n'est pas affecté!):
Méthode alternative 2
ssh
Si vous avez besoin d'un accès continu, vous pouvez installer sshd sur votre conteneur et exécuter le démon sshd:
De cette façon, vous pouvez exécuter votre application à l'aide de ssh (connectez-vous et exécutez ce que vous voulez).
MISE À JOUR: Méthode alternative 3
nsenter
Utilisation
nsenter
, voir https://web.archive.org/web/20160305150559/http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/la source
Option 1
.RUN apk update && apk add bash
(taille: ~ 4 Mo)docker exec -t -i mycontainer /bin/sh
MISE À JOUR: EXPLORER!
Cette commande devrait vous permettre d' explorer un conteneur Docker en cours d'exécution :
L'équivalent pour cela dans docker-compose serait:
(web est le nom du service dans ce cas et il a tty par défaut.)
Une fois à l'intérieur, faites:
ou toute autre commande bash comme:
Cette commande devrait vous permettre d' explorer une image de docker :
une fois à l'intérieur faire:
ou toute autre commande bash comme:
Le
-it
signifie interactif ... et tty.Cette commande devrait vous permettre d' inspecter un conteneur ou une image de docker en cours d'exécution :
docker inspect name-of-container-or-image
Vous voudrez peut-être le faire et savoir s'il y en a
bash
ou s'il ysh
en a. Recherchez point d'entrée ou cmd dans le retour json.voir la documentation de docker exec
voir la documentation de docker-compose exec
voir docker inspecter la documentation
la source
docker exec -ti <name> powershell
( source )docker exec -ti <name> cmd
fonctionnait. Et pour d'autres débutants comme moi, assurez-vous d'utiliser le nom d'instance de conteneurdocker ps
(quelque chose comme 070494393ca5) plutôt que le nom lisible que vous lui avez attribué.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 nonalpine
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:
Ou répertoriez les fichiers:
Notez qu'en fonction de l'image, cela peut prendre du temps et de l'espace disque.
la source
export
exemple ci-dessus a frappé le spot:docker export adoring_kowalevski | tar tf -
f -
de la fin de votre commande, tar lit par défaut l'entrée standard. Fonctionne simplementdocker export adoring_kowalevski | tar t
.tar f
dépend de sa configuration. Une partie est laTAPE
variable d'environnement. D'autres sont contrôlés dans le cadre de la construction. L'effet net est que l'on ne doit jamais supposer qu'il lit stdin ou écrit stdout mais le déclare toujours explicitement.Le système de fichiers du conteneur se trouve dans le dossier de données de docker, normalement dans / var / lib / docker. Pour démarrer et inspecter un système de fichiers de conteneurs en cours d'exécution, procédez comme suit:
Et maintenant, le répertoire de travail actuel est la racine du conteneur.
la source
Avant la création du conteneur:
Si vous souhaitez explorer la structure de l'image qui est montée à l'intérieur du conteneur, vous pouvez le faire
Cela vous donnerait la visibilité de toutes les couches d'une image et sa configuration qui est présente dans les fichiers json.
Après la création du conteneur:
Pour cela, il y a déjà beaucoup de réponses ci-dessus. ma façon préférée de le faire serait -
la source
La réponse la plus votée fonctionne pour moi lorsque le conteneur est réellement démarré, mais quand il n'est pas possible de l'exécuter et que vous souhaitez par exemple copier des fichiers du conteneur, cela m'a déjà sauvé:
Grâce à docker cp ( lien ), vous pouvez copier directement à partir du conteneur comme c'était n'importe quelle autre partie de votre système de fichiers. Par exemple, récupérer tous les fichiers à l'intérieur d'un conteneur:
Notez que vous n'avez pas besoin de spécifier que vous souhaitez copier récursivement.
la source
Sur Ubuntu 14.04 exécutant Docker 1.3.1 , j'ai trouvé le système de fichiers racine du conteneur sur la machine hôte dans le répertoire suivant:
Informations complètes sur la version Docker:
la source
devicemapper
répertoire). Le fichier existe sous/var/lib/docker/overlay/<a sha256 apparently/<upper or merged>/...
. Je ne sais pas à quel point il est portable / sûr d'y accéderdirect-lvm
par exemple.Essayez d'utiliser
Il est possible que bash ne soit pas implémenté. pour cela vous pouvez utiliser
la source
J'utilise un autre truc sale qui est agnostique aufs / devicemapper.
Je regarde la commande que le conteneur exécute par exemple
docker ps
et si c'est un apache oujava
je fais juste ce qui suit:et voilá vous êtes à l'intérieur du conteneur.
Fondamentalement, vous pouvez en tant que root root dans un
/proc/<PID>/root/
dossier tant que ce processus est exécuté par le conteneur. Attention, les liens symboliques n'auront aucun sens lorsque vous utiliserez ce mode.la source
La réponse la plus votée est bonne, sauf si votre conteneur n'est pas un véritable système Linux.
De nombreux conteneurs (en particulier ceux basés sur Go) n'ont pas de binaire standard (non
/bin/bash
ou/bin/sh
). Dans ce cas, vous devrez accéder directement au fichier de conteneurs réel:Fonctionne comme un charme:
Remarque: vous devez l'exécuter en tant que root.
la source
Dans mon cas, aucun shell n'a été pris en charge dans le conteneur, sauf
sh
. Donc, cela a fonctionné comme un charmela source
vous pouvez utiliser la plongée pour afficher le contenu de l'image de manière interactive avec TUI
https://github.com/wagoodman/dive
la source
Cela lancera une session bash pour l'image:
docker run --rm -it --entrypoint = / bin / bash
la source
Pour moi, celui-ci fonctionne bien (merci aux derniers commentaires pour avoir signalé le répertoire / var / lib / docker / ):
Ici, 2465790aa2c4 est l'ID court du conteneur en cours d'exécution (tel qu'affiché par docker ps ), suivi d'une étoile.
la source
Sur les nouvelles versions de Docker, vous pouvez exécuter
docker exec [container_name]
qui exécute un shell à l'intérieur de votre conteneurDonc, pour obtenir une liste de tous les fichiers d'un conteneur, il suffit d'exécuter
docker exec [container_name] ls
la source
Pour le pilote docker aufs:
Le script trouvera le répertoire racine du conteneur (test sur docker 1.7.1 et 1.10.3)
la source
Aucune des réponses existantes ne traite du cas d'un conteneur qui est sorti (et ne peut pas être redémarré) et / ou n'a pas de shell installé (par exemple, ceux sans distraction). Celui-ci fonctionne tant que vous avez un accès root à l'hôte Docker.
Pour une véritable inspection manuelle, découvrez d'abord les ID de couche:
Dans la sortie, vous devriez voir quelque chose comme
Naviguez dans ce dossier (en tant que root) pour trouver l'état visible actuel du système de fichiers du conteneur.
la source
Cette réponse aidera ceux (comme moi) qui souhaitent explorer le système de fichiers du volume Docker même si le conteneur n'est pas en cours d'exécution.
Liste des conteneurs Docker en cours d'exécution:
docker ps
=> ID CONTENANT "4c721f1985bd"
Regardez les points de montage du volume Docker sur votre machine physique locale ( https://docs.docker.com/engine/tutorials/dockervolumes/ ):
docker inspect -f {{.Mounts}} 4c721f1985bd
=> [{/ tmp / container-garren / tmp true rprivate}]
Cela m'indique que le répertoire de la machine physique locale / tmp / container-garren est mappé sur la destination du volume docker / tmp.
Connaître le répertoire de la machine physique locale (/ tmp / container-garren) signifie que je peux explorer le système de fichiers, que le conteneur Docker soit en cours d'exécution ou non. Cela était essentiel pour m'aider à comprendre qu'il y avait des données résiduelles qui n'auraient pas dû persister même après que le conteneur n'était pas en cours d'exécution.
la source
une autre astuce consiste à utiliser l' outil atomique pour faire quelque chose comme:
L'image Docker sera montée dans / path / to / mnt pour que vous puissiez l'inspecter.
la source
Uniquement pour LINUX
La façon la plus simple que j'utilise était d'utiliser proc dir, qui est le conteneur qui doit être en cours d'exécution afin d'inspecter les fichiers du conteneur docker.
Découvrez l'ID de processus (PID) du conteneur et stockez-le dans une variable
Assurez-vous que le processus de conteneur est en cours d'exécution et utilisez la variable nameto pour accéder au dossier du conteneur
Si vous voulez parcourir le répertoire sans trouver le numéro PID simplement en utilisant cette longue commande
Conseils:
Après avoir pénétré à l'intérieur du conteneur, tout ce que vous faites affectera le processus réel du conteneur, tel que l'arrêt du service ou la modification du numéro de port.
J'espère que cela aide
Remarque:
Cette méthode ne fonctionne que si le conteneur est toujours en cours d'exécution, sinon le répertoire n'existerait plus si le conteneur s'est arrêté ou supprimé
la source
Ma façon préférée de comprendre ce qui se passe à l'intérieur du conteneur est:
exposer -p 8000
Démarrer le serveur à l'intérieur
la source
Pour un conteneur déjà en cours d'exécution, vous pouvez faire:
Vous devez être root pour pouvoir accéder à ce répertoire. Si vous n'êtes pas root, essayez 'sudo su' avant d'exécuter la commande.
Edit: Après la v1.3, voir la réponse de Jiri - c'est mieux.
la source
Si vous utilisez Docker v19.03, vous suivez les étapes ci-dessous.
la source
Si vous utilisez le pilote de stockage AUFS, vous pouvez utiliser mon script de couche d'ancrage pour trouver la racine du système de fichiers (mnt) et la couche de réécriture de n'importe quel conteneur:
Edit 2018-03-28:
docker-layer a été remplacé par docker-backup
la source
La
docker exec
commande pour exécuter une commande dans un conteneur en cours d'exécution peut aider dans plusieurs cas.Par exemple :
1) Accès en bash au système de fichiers du conteneur en cours d'exécution:
2) Accès en bash au système de fichiers du conteneur en cours d'exécution en tant que root pour pouvoir disposer des droits requis:
Ceci est particulièrement utile pour pouvoir effectuer certains traitements en tant que root dans un conteneur.
3) Accès en bash au système de fichiers conteneur en cours d'exécution avec un répertoire de travail spécifique:
la source
Vous pouvez exécuter un bash à l'intérieur du conteneur avec ceci:
$ docker run -it ubuntu /bin/bash
la source