Ma question est liée à cette question sur la copie de fichiers depuis des conteneurs vers des hôtes; J'ai un Dockerfile qui récupère les dépendances, compile un artefact de construction à partir de la source et exécute un exécutable. Je veux aussi copier l'artefact de construction (dans mon cas, c'est un .zip
produit par sbt dist
dans '../ target / `, mais je pense que cette question s'applique également aux jars, binaires, etc.
docker cp
fonctionne sur des conteneurs, pas sur des images; dois-je démarrer un conteneur juste pour en extraire un fichier? Dans un script, j'ai essayé de courir /bin/bash
en mode interactif en arrière-plan, de copier le fichier, puis de tuer le conteneur, mais cela semble kludgey. Y a-t-il un meilleur moyen?
D'un autre côté, je voudrais éviter de décompresser un .tar
fichier après l'exécution docker save $IMAGENAME
juste pour en extraire un (mais cela semble être l'option la plus simple, bien que la plus lente, pour le moment).
J'utiliserais des volumes de docker, par exemple:
docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out
mais j'exécute sous boot2docker
OSX et je ne sais pas comment écrire directement sur mon système de fichiers hôte mac (les volumes en lecture-écriture sont montés dans ma VM boot2docker, ce qui signifie que je ne peux pas facilement partager un script pour extraire blah.zip
d'une image avec d'autres.
la source
create
commande a-t-elle été ajoutée / supprimée (elle n'est pas présente dans la version 1.01)docker create
été introduit dans docker 1.3, blog.docker.com/2014/10/…docker cp $id:path > local-tar-file
fonctionnait parfaitement.Malheureusement, il ne semble pas y avoir de moyen de copier des fichiers directement à partir d'images Docker. Vous devez d'abord créer un conteneur, puis copier le fichier à partir du conteneur.
Cependant, si votre image contient une
cat
commande (et cela fera l'affaire dans de nombreux cas), vous pouvez le faire avec une seule commande:Si votre image ne contient pas
cat
, créez simplement un conteneur et utilisez ladocker cp
commande comme suggéré dans la réponse d'Igor.la source
Une option beaucoup plus rapide consiste à copier le fichier du conteneur en cours d'exécution vers un volume monté:
** CONTRE **
la source
cat a >b
vscp a b
ont des horaires similaires, comme indiqué ici. De plus, si le chemin source et le chemin de destination résident sur des systèmes de fichiers différents, les deux exemples conduiront à une copie octet par octet complète.Le commentaire d'un parent a déjà montré comment utiliser cat . Vous pouvez également utiliser tar de la même manière:
la source
docker run --rm --entrypoint tar _image_ cC _img_directory_ . | tar xvC _host_directory_
voulait fournir une solution à une ligne
edit: le conteneur n'a même pas besoin d'être exécuté dans cette solution
la source
Une autre (courte) réponse à ce problème:
Mise à jour - comme indiqué par @Elytscha Smith, cela ne fonctionne que si votre image est intégrée à bash
la source
J'utilise boot2docker sur MacOS. Je peux vous assurer que les scripts basés sur "docker cp" sont portables. Parce que toute commande est relayée dans boot2docker mais que le flux binaire est ensuite retransmis au client de ligne de commande docker exécuté sur votre mac. Les opérations d'écriture depuis le client docker sont donc exécutées à l'intérieur du serveur et réécrites sur l'instance client en cours d'exécution!
Je partage un script de sauvegarde pour les volumes Docker avec n'importe quel conteneur Docker que je fournis et mes scripts de sauvegarde sont testés à la fois sur Linux et MacOS avec boot2docker. Les sauvegardes peuvent être facilement échangées entre les plates-formes. En gros, j'exécute la commande suivante dans mon script:
J'ai déjà déplacé des archives entre le conteneur Linux et mon conteneur Mac sans aucun ajustement du script de sauvegarde ou de restauration. Si c'est ce que vous voulez, vous trouverez l'ensemble du script un tutoriel ici: blacklabelops / jenkins
la source
Vous pouvez lier un chemin local sur l'hôte à un chemin sur le conteneur, puis
cp
le (s) fichier (s) souhaité (s) à ce chemin à la fin de votre script.Ensuite, il n'est pas nécessaire de copier par la suite.
la source