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.
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 create
documentation , 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é dansSTDOUT
. Ceci est similaire àdocker run -d
Sauf que le conteneur n'est jamais démarré. Vous pouvez ensuite utiliser la commandedocker 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
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.
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.
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.