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

24

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?

dflemstr
la source
Pourquoi serait-il mal de lier ces montages ailleurs?
Michael Hampton
1
Parce que l'emplacement de stockage est un détail d'implémentation. Le docker de jour ajoute un autre pilote de stockage, l'emplacement se déplacera. J'ai besoin de rendre cela semi-automatique et ce serait bien d'utiliser des API publiques pour cette raison.
dflemstr
2
Il pourrait être utile d'envisager de travailler sur nsenter (ou docker-enter) pour atteindre vos objectifs; il y a bien sûr la contrainte de devoir rnu le code / les outils d'inspection à l'intérieur du conteneur.
VladFr
N'y a-t-il aucun moyen de demander à Linux de monter à travers une frontière de conteneur?
dflemstr
@dflemstr oui, il y a, - volumes-from fait un peu cela, il semble monter une union du répertoire à partir de l'image de base de l'autre conteneur et du volume, mais ce comportement n'est pas documenté afaik
Tarnay Kálmán

Réponses:

10

Jetez un oeil à 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.

laktak
la source
2
Mes images sont assez grandes (plusieurs centaines de Mio), donc faire cela pour récupérer des fichiers individuels est trop lourd. Il créera à chaque fois le fichier de plusieurs centaines de mégaoctets.
dflemstr
@dflemstr utilise la ligne avec tar x PATH-IN-CONTAINER, il extraira uniquement les fichiers dont vous avez besoin.
laktak
... mais l' tararchive entière est toujours créée dans le démon Docker, et la création prend plusieurs minutes ...
dflemstr
@dflemstr ne sait pas quelle est votre configuration, mais docker export ubuntu|tar -t|grep etc/networkprend par exemple 3 secondes pour moi.
laktak
Vous exécutez probablement cela sur la même machine que le démon Docker, vous n'avez donc pas besoin de faire un transfert réseau, et l' ubuntuimage est vraiment petite ...
dflemstr
3

Vous pouvez utiliser la validation Docker 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 d'un fichier de 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.

Eric Citaire
la source
2

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.

gmuslera
la source
1

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 de docker et l'utiliser docker execpour exécuter un service ssh ( /usr/sbin/sshd -D) sur le conteneur de docker (notez que le port SSH 22 du conteneur de docker doit être exposé).

Ensuite, utilisez docker cppour copier votre clé publique ssh dans le /root/.ssh/authorized_keysrépertoire du conteneur Docker.

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

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.

mnieber
la source