Question Copie de fichiers de l'hôte vers le conteneur Docker


J'essaie de créer une solution de sauvegarde et de restauration pour les conteneurs Docker avec lesquels nous travaillons.

J'ai l'image de base de Docker que j'ai créée, ubuntu:base, et ne veulent pas avoir à le reconstruire chaque fois avec un fichier Docker pour y ajouter des fichiers.

Je veux créer un script qui s'exécute à partir de la machine hôte et crée un nouveau conteneur en utilisant le ubuntu:base Image Docker, puis copie les fichiers dans ce conteneur.

Comment puis-je copier des fichiers de l'hôte vers le conteneur?


875
2018-04-07 08:28


origine


Réponses:


le cp commande peut être utilisée pour copier des fichiers. Un fichier spécifique peut être copié comme:

docker cp foo.txt mycontainer:/foo.txt
docker cp mycontainer:/foo.txt foo.txt

Plusieurs fichiers contenus dans le dossier src peut être copié dans le target dossier utilisant:

docker cp src/. mycontainer:/target
docker cp mycontainer:/src/. target

Référence: Docker CLI docs pour cp 

Dans les versions de Docker antérieures à la version 1.8, il était seulement possible de copier des fichiers d'un conteneur vers l'hôte. Pas de l'hôte à un conteneur.


1515
2017-08-12 17:25



  1. Obtenir le nom du conteneur ou l'identifiant du conteneur court:

    $ docker ps
    
  2. Obtenir l'identifiant complet du conteneur:

    $ docker inspect -f   '{{.Id}}'  SHORT_CONTAINER_ID-or-CONTAINER_NAME
    
  3. Copier un fichier:

    $ sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE
    

EXEMPLE:

$ docker ps

CONTAINER ID      IMAGE    COMMAND       CREATED      STATUS       PORTS        NAMES

d8e703d7e303   solidleon/ssh:latest      /usr/sbin/sshd -D                      cranky_pare

$ docker inspect -f   '{{.Id}}' cranky_pare

ou

$ docker inspect -f   '{{.Id}}' d8e703d7e303

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt

150
2017-07-17 14:01



Le moyen le plus propre est de monter un répertoire hôte sur le conteneur avant d'exécuter votre commande:

{host} docker run -v /path/to/hostdir:/mnt --name my_container my_image
{host} docker exec -it my_container bash
{container} cp /mnt/sourcefile /path/to/destfile

109
2017-08-12 21:28



Ce qui suit est une façon assez laide de le faire mais cela fonctionne.

docker run -i ubuntu /bin/bash -c 'cat > file' < file

101
2018-06-11 16:02



Si vous devez le faire sur un conteneur en cours d'exécution, vous pouvez utiliser l'exec docker (ajouté en 1.3).

D'abord, trouvez le nom ou l'identifiant du conteneur:

$ docker ps
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                   NAMES
b9b7400ddd8f        ubuntu:latest                "/bin/bash"         2 seconds ago       Up 2 seconds                                elated_hodgkin

Dans l'exemple ci-dessus, nous pouvons soit utiliser b9b7400ddd8f ou elated_hodgkin.

Si vous vouliez tout copier dans /tmp/somefiles sur l'hôte à /var/www dans le conteneur:

$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www

Nous pouvons alors exec /bin/bash dans le conteneur et vérifiez qu'il a fonctionné:

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2

37
2018-01-24 07:38



La solution est donnée ci-dessous,

De la coquille Docker,

root@123abc:/root#  <-- get the container ID

De l'hôte

cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root

Le fichier doit être directement copié à l'emplacement où se trouve le conteneur sur le système de fichiers.


32
2018-06-23 17:01



Une autre solution pour copier des fichiers dans un conteneur en cours utilise tar:

tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x

Copie le fichier foo.sh dans /tmp du conteneur.

Modifier: Supprimer le redonant -f, grâce à Maartens commentaire.


25
2018-04-21 13:50



Très facile

  1. Créez un nouveau fichier docker et utilisez l'image existante comme base.

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. Puis construisez le conteneur:

    docker build .
    

20
2017-07-08 20:47



Pour copier un fichier de l'hôte au conteneur en cours d'exécution

docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH

Basé sur La réponse d'Erik et les commentaires de Mikl et z0r.


19
2017-07-01 09:09



Avec Docker 1.8, docker cp est capable de copier des fichiers de l'hôte vers le conteneur. Voir le blog de Docker Annonce de Docker 1.8: approbation de contenu, boîte à outils et mises à jour du registre et de l'orchestration.


11
2017-08-12 17:22



Ceci est une réponse directe à la question «Copier des fichiers de l'hôte vers le conteneur Docker» soulevée dans cette question dans le titre.

Essayer docker cp. C'est le moyen le plus simple de le faire et fonctionne même sur mon Mac. Usage:

docker cp /root/some-file.txt some-docker-container:/root

Cela va copier le fichier some-file.txt dans le répertoire /root sur votre ordinateur hôte dans le conteneur Docker nommé some-docker-container dans le répertoire /root. Il est très proche de la syntaxe de copie sécurisée. Et comme indiqué dans le post précédent, vous pouvez l'utiliser vice versa. Par exemple, vous copiez également des fichiers du conteneur vers l'hôte.

Et avant de publier ce post, veuillez entrer docker cp --help. Lire la documentation peut être très utile, parfois ...

Si vous n'aimez pas cela et que vous voulez des volumes de données dans votre conteneur déjà créé et en cours d'exécution, alors la récréation est votre seule option aujourd'hui. Voir également Comment puis-je ajouter un volume à un conteneur Docker existant?.


11
2017-09-23 13:18