web-dev-qa-db-fra.com

Monter le contenu du conteneur Docker dans le système de fichiers hôte

Je veux pouvoir inspecter le contenu d'un conteneur Docker (lecture seule). Une manière élégante de le faire serait de monter le contenu du conteneur dans un répertoire. Je parle de monter le contenu d'un conteneur sur l'hôte, pas de monter un dossier sur l'hôte à l'intérieur d'un conteneur.

Je peux voir qu'il y a actuellement deux pilotes de stockage dans Docker: aufs et btrfs. Ma propre installation Docker utilise btrfs, et la navigation vers/var/lib/docker/btrfs/subvolumes me montre un répertoire par conteneur Docker sur le système. Il s'agit cependant d'un détail d'implémentation de Docker et il ne semble pas correct de monter - lier ces répertoires ailleurs.

Existe-t-il un moyen approprié de le faire ou dois-je patcher Docker pour prendre en charge ce type de montures?

26
dflemstr

Jeter un coup d'œil à docker export.

Pour répertorier rapidement les fichiers dans votre conteneur:

docker export CONTAINER|tar -t

Exporter:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

Ou pour regarder un fichier:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8 prend en charge cp :

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

mise à jour: vous devez ssh sur votre machine docker lorsque vous l'exécutez.

14
laktak

Vous pouvez utiliser docker commit pour conserver l'état actuel de votre conteneur dans une nouvelle image et démarrer un conteneur interactif à partir de cette image pour inspecter le contenu.

De la documentation:

Il peut être utile de valider les modifications ou les paramètres de fichier d'un conteneur dans une nouvelle image. Cela vous permet de déboguer un conteneur en exécutant un shell interactif ou d'exporter un jeu de données de travail vers un autre serveur.

J'espère que cela t'aides.

3
Eric Citaire

Vous pouvez utiliser nsenter pour exécuter votre programme d'inspection (qui doit probablement déjà être inclus dans le conteneur) à l'intérieur d'un conteneur/espace de noms. Mais pour monter le système de fichiers conteneur comme on le voit à l'intérieur, vous devez monter l'image d'origine et toutes les couches if est aufs, ou l'action équivalente pour le mappeur de périphériques, btrfs et les autres (futurs) moteurs de stockage utilisés, différents dans chaque cas. Il serait probablement plus efficace de laisser Docker faire le travail pour vous, exactement comme il est censé le faire, et d'utiliser nsenter pour effectuer l'inspection à l'intérieur du conteneur.

Il existe d'autres approches. docker diff affiche les fichiers modifiés dans ce conteneur, si vous souhaitez voir ce qui a changé au lieu de ce qui était dans l'image d'origine.

Et pour les données qui doivent être persistantes et inspectables, un meilleur schéma serait probablement de les avoir dans un volume dans le conteneur, et de les monter soit sur le système de fichiers réel, soit dans un conteneur de données pur, ou dans le même conteneur, mais que vous pouvez lancer un autre conteneur avec le programme d'inspection en montant ces volumes.

2
gmuslera

EDIT: J'ai essayé la solution ci-dessous et malheureusement, cela n'a pas bien fonctionné pour moi dans la pratique. Le système de fichiers monté ne reflétait pas avec précision le système de fichiers du conteneur (même avec cache=no). Je ne sais pas si c'est un problème fondamental ou si je fais quelque chose de mal.

Vous pouvez installer sshd dans l'image du docker et utiliser docker exec pour exécuter un service ssh (/usr/sbin/sshd -D) sur le conteneur Docker (notez que le port SSH 22 du conteneur Docker doit être exposé).

Ensuite, utilisez docker cp pour copier votre clé publique ssh dans le /root/.ssh/authorized_keys répertoire du conteneur docker.

Enfin, utilisez docker inspect pour trouver l'adresse IP du conteneur et monter le système de fichiers du conteneur à l'aide

Sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  [email protected]:/ /mnt/my_container

Vous devez écrire un script pour que ce travail soit confortable dans la pratique.

1
mnieber