web-dev-qa-db-fra.com

Extraire le fichier de l'image docker?

Je voudrais extraire un fichier d'une image Docker sans avoir à exécuter l'image.

L'option docker save N'est pas actuellement une option viable pour moi car elle enregistre un fichier trop volumineux juste pour annuler le tar d'un fichier spécifique.

32
BlakBat

Vous pouvez extraire des fichiers d'une image avec les commandes suivantes:

docker create $image  # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id

Selon le docker createdocumentation , cela n'exécute pas le conteneur:

La commande docker create Crée une couche conteneur inscriptible sur l'image spécifiée et la prépare pour l'exécution de la commande spécifiée. L'ID du conteneur est ensuite imprimé dans STDOUT. Ceci est similaire à docker run -d Sauf que le conteneur n'est jamais démarré. Vous pouvez ensuite utiliser la commande docker start <container_id> Pour démarrer le conteneur à tout moment.


Pour référence (ma réponse précédente), un moyen moins efficace d'extraire un fichier d'une image est le suivant:

docker run some_image cat $file_path > $output_path
32
bbc

Rien de tout cela n'a fonctionné pour moi. La commande de travail complète est:

docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename

Sans guillemets cat est passé sans nom de fichier, il ne sait donc pas quoi afficher. C'est également une bonne idée de supprimer le conteneur une fois la commande terminée.

4
sekrett

Si je ne me trompe pas, je pense que les conteneurs Docker stockent les fichiers mis en cache créés dans le répertoire suivant pour Ubuntu:

/var/lib/docker/aufs/diff/<container_id>

De là, vous devriez pouvoir accéder au système de fichiers et récupérer vos fichiers.

1
ryekayo

Si vous stockez la sortie complète de docker save n'est pas une option, vous pouvez utiliser des pipelines pour en extraire uniquement le fichier nécessaire.

Malheureusement, comme la sortie est un "goudron de goudron", il peut s'agir d'un processus légèrement itératif.

Ce que j'ai fait quand j'ai eu besoin d'extraire un fichier tout à l'heure était:

1) Déterminez la version de l'image que le fichier qui vous intéresse a changé le plus récemment (la façon dont vous procédez dépend probablement de votre image) et la date de sa création/sauvegarde

2) Obtenez la table des matières complète à partir de la sortie du docker save commande avec:

docker save IMAGE_NAME | tar -tvf -

3) Amende le layer.tar fichier (s) dans la sortie de cette commande qui correspondent à la date de l'image que vous avez déterminée à l'étape 1. (vous pouvez ajouter | grep layer.tar pour simplement montrer ces fichiers)

4) Extrayez que layer.tar fichier en sortie standard, et récupérez la table des matières:

docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -

5) Vérifiez que le fichier souhaité est répertorié et extrayez-le une fois que vous avez trouvé le nom:

docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE

S'il y a plus d'un layer.tar fichiers correspondant à la date que vous recherchez à l'étape 2/3, vous devrez peut-être répéter l'étape 4 pour chacun d'eux jusqu'à ce que vous trouviez la bonne

Remplacez le texte en majuscules dans les commandes ci-dessus par les noms d'image, les sommes de contrôle et les noms de fichiers corrects pour votre cas.

0
Michael Firth