Copier des fichiers de l'hôte vers le conteneur Docker

j'essaie de construire une solution de sauvegarde et de restauration pour les conteneurs Docker avec lesquels nous travaillons.

j'ai Docker image de base que j'ai créé, ubuntu:base , et je ne veux 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 l'image ubuntu:base du Docker, puis copie les fichiers dans ce conteneur.

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

946
demandé sur Peter Mortensen 2014-04-07 12:28:55

30 réponses

la commande cp 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

Pour l'accent, mycontainer est un conteneur ID pas un image ID.

plusieurs fichiers contenus dans le dossier src peuvent être copiés dans le dossier target en utilisant:

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

référence: Docker CLI docs for cp

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

1626
répondu h3nrik 2018-09-13 03:42:28
  1. obtenir le nom du conteneur ou le numéro d'identification du conteneur court:

    $ docker ps
    
  2. obtenir le numéro d'identification du conteneur complet:

    $ docker inspect -f   '{{.Id}}'  SHORT_CONTAINER_ID-or-CONTAINER_NAME
    
  3. Copier le 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
152
répondu solidleon 2017-03-11 10:29:07

le moyen le plus propre est de monter un répertoire hôte sur le conteneur lors du démarrage du conteneur:

{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
113
répondu Ben Davis 2018-09-05 09:20:25

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
103
répondu Erik 2014-06-11 16:22:18

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

tout d'abord, trouver le nom ou L'identification 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 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érifier que cela a fonctionné:

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2
37
répondu adean 2015-01-24 07:38:07

la solution est donnée ci-dessous,

à Partir du menu fixe shell,

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 copié directement à l'endroit où le conteneur se trouve sur le système de fichiers.

33
répondu pierce 2017-09-18 12:52:43

une autre solution pour copier des fichiers dans un conteneur en cours d'exécution est d'utiliser tar:

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

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

Edit: Supprimer reduntant -f , grâce à Martin s commentaire.

25
répondu joemat 2017-05-23 12:10:54

très facile

  1. créez un nouveau fichier dockerfile et utilisez l'image existante comme base.

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. puis construire le conteneur:

    docker build .
    
23
répondu Rusty Shackleford 2017-05-26 08:31:39

pour copier un fichier de l'hôte au conteneur

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
répondu Andrea 2017-05-23 11:55:19

avec Docker 1.8, docker cp est capable de copier des fichiers de l'hôte au conteneur. Voir L'article du blog Docker annonçant Docker 1.8: Content Trust, Toolbox, and Updates to Registry and Orchestration .

11
répondu joemat 2017-03-11 10:35:49

il s'agit d'une réponse directe à la question "copier des fichiers de l'hôte au conteneur Docker" soulevée dans cette question dans le titre.

Essayer docker cp . C'est la façon la plus facile de faire cela et fonctionne même sur mon Mac. Usage:

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

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

Et avant de liaison descendante de ce poste, veuillez saisir le docker cp --help . Lire la documentation peut être très utile, parfois...

si vous n'aimez pas cette façon 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 aussi ajouter un volume à un conteneur Docker? .

11
répondu Hiro.Protagonist 2017-05-23 12:10:54

si le conteneur tourne déjà, tapez la commande suivante:

# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"

pour partager des fichiers en utilisant le répertoire partagé, lancez le conteneur en tapant la commande suivante:

# docker run -v /path/to/host/dir:/path/to/container/dir ...

Note: des problèmes avec les permissions peuvent survenir car les utilisateurs de container ne sont pas les mêmes que les utilisateurs de l'hôte.

7
répondu johndodo 2017-09-19 14:46:26

dans un environnement docker, tous les conteneurs se trouvent dans le répertoire:

/var/lib/docker/aufs/required-docker-id/

pour copier le répertoire/fichier source dans n'importe quelle partie du conteneur, tapez la commande donnée:

sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/

6
répondu aabdulwahed 2017-09-19 14:30:55

pour copier des fichiers / dossiers entre un conteneur et le système de fichiers local, tapez la commande:

docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}

par exemple,

docker cp /home/foo container-id:/home/dir

pour obtenir l'id de contianer, tapez la commande donnée:

docker ps

le contenu ci-dessus est tiré de docker.com .

6
répondu prayagupd 2017-09-19 15:29:36

tar et docker cp sont un bon combo pour copier tout dans un répertoire.

créer un conteneur de volume de données

docker create --name dvc --volume /path/on/container cirros

pour préserver la hiérarchie du répertoire

tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container

Vérifiez votre travail

docker run --rm --volumes-from dvc cirros ls -al /path/on/container
4
répondu Everett Toews 2016-05-09 18:39:50

vous pouvez simplement tracer l'adresse IP de votre machine locale en utilisant

ifconfig

alors entrez dans votre conteneur Docker et tapez

scp user_name@ip_address:/path_to_the_file destination

dans tous les cas, si vous n'avez pas de client et de serveur SSH installé, installez-le simplement en utilisant:

sudo apt-get install openssh-server
4
répondu Harshit Anand 2017-03-11 10:34:42

j'ai essayé la plupart des solutions (mises en minorité) ici mais dans docker 17.09 (en 2018) il n'y a plus de dossier /var/lib/docker/aufs.

ce simple docker cp a résolu cette tâche.

docker cp c:\path\to\local\file container_name:/path/to/target/dir/

Comment obtenir container_name? (Il y a la section NAMES . N'utilisez pas IMAGE .)

 docker ps 
4
répondu Aaron 2018-01-17 21:18:54

beaucoup de ceux qui trouvent cette question peuvent en fait avoir le problème de copier des fichiers dans une image de Docker alors qu'il est créé (Je l'ai fait).

dans ce cas, vous pouvez utiliser la commande COPY dans la commande Dockerfile que vous utilisez pour créer l'image.

voir la documentation .

3
répondu Klas Mellbourn 2017-03-11 10:33:34

si L'hôte est CentOS ou Fedora, il y a un mandataire non dans /var/lib/docker/aufs , mais il est sous /proc :

cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root

ce cmd copiera tout le contenu du répertoire data vers / du conteneur avec l'id"containerid".

3
répondu Abdennour TOUMI 2017-03-11 10:38:58

la meilleure façon de copier des fichiers dans le conteneur que j'ai trouvé est de monter un répertoire sur l'hôte en utilisant l'option -v de la commande docker run.

2
répondu Prakash Varandani 2015-06-22 15:04:49

il y a de bonnes réponses, mais trop spécifiques. Je découvre que docker ps est un bon moyen d'obtenir une carte d'identité de conteneur qui vous intéresse. Alors faites

mount | grep <id>

pour voir où le volume est monté. C'est

/var/lib/docker/devicemapper/mnt/<id>/rootfs/

pour moi, mais il pourrait s'agir d'un chemin différent en fonction de L'OS et de la configuration. Maintenant, copiez simplement les fichiers sur ce chemin.

utiliser -v n'est pas toujours pratique.

2
répondu akostadinov 2017-03-11 10:31:47

il suffit de copier le fichier directement à partir de l'endroit où le conteneur est situé à partir de la machine hôte.

par exemple:

tout D'abord trouver le numéro d'identification du conteneur:

root@**3aed62678d54**:/home#

et puis de l'hôte, disons que le fichier est dans le répertoire d'origine:

root@saasdock:/home/dnepangue# cp cheering_nasa.gif /var/lib/docker/aufs/mnt/**3aed62678d54**a5df47a4a00a58bb0312009c2902f8a37498a1427052e8ac454b/home/

retour au conteneur...

root@**3aed62678d54**:/home# ls cheering_nasa.gif
1
répondu asterinux 2017-03-11 10:27:19

si vous utilisez Windows comme hôte, vous pouvez utiliser WinSCP pour vous connecter à Docker et transférer des fichiers via L'interface graphique.

si sous Linux, la commande scp fonctionnerait aussi à travers le terminal.

1
répondu R.K 2017-03-11 10:43:53

C'est un onliner pour copier un seul fichier lors de l'exécution d'un conteneur tomcat.

docker run -v /PATH_TO_WAR/sample.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcat

cela copiera le fichier war dans le répertoire webapps et lancera votre application en peu de temps.

1
répondu karthik101 2017-10-24 12:53:05

dans le cas où il n'est pas clair pour quelqu'un comme moi ce que mycontainer dans @h3nrik réponse signifie, Il est en fait le conteneur id. Pour copier un fichier WarpSquare.mp4 dans /app/example_scenes/1440p60 d'un conteneur docker sorti vers un dossier courant j'ai utilisé ceci.

docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .

docker ps -q -l tire le numéro d'identification du conteneur de la dernière instance sortie. Dans le cas où il ne s'agit pas d'un conteneur sorti, vous pouvez l'obtenir par docker container ls ou docker ps

1
répondu ishandutta2007 2018-08-08 06:49:14

si vous n'avez pas de répertoire défini comme un volume dans le fichier Dockerfile, le fichier /var/lib/docker/aufs/mnt// fonctionnera. Mais il y a des cas où le répertoire dans le conteneur est défini comme un volume. Dans ce cas, le contenu sous aufs/mnt/*/ et le contenu vu par le conteneur sont différents.

vous aurez besoin d'inspecter le conteneur à l'aide d'un docker inspecter, puis, chercher les volumes. Vous y trouverez une mention pour quelque chose comme var/lib/docker/vfs/dir / fe940b... (ID.) Vous devrez ajouter / modifier les fichiers ici au lieu de sous aufs/mnt/*.

la partie confuse est que les fichiers apparaissent aussi sous /aufs/mnt/*. J'ai passé pas mal de temps à me gratter la tête.pourquoi les changements ici ne marchaient pas pour moi. Espérons que cela aide quelqu'un.

0
répondu user3392439 2014-09-28 10:40:00

ma méthode préférée:

conteneurs:

CONTAINER_ID=$(docker ps | grep <string> | awk '{ print  }' | xargs docker inspect -f '{{.Id}}')
"151970920 de fichier".txt
mv -f file.txt /var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/root/file.txt

ou

mv -f file.txt /var/lib/docker/aufs/mnt/$CONTAINER_ID/rootfs/root/file.txt
0
répondu user3159411 2015-01-16 02:59:07

j'aimerais monter, puis exécutez l'image avec un démon, n'importe quelle donnée ici;

docker run -d -v /blah1/blah2:/mnt --name mntcontainer ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

puis

docker exec -it mntcontainer bash
0
répondu East2West 2016-01-31 23:42:44

une Autre solution est d'utiliser le bon vieux scp . Ceci est utile dans le cas où vous devez copier un répertoire.

à partir de votre course hôte:

scp FILE_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp foo.txt 172.17.0.2:foo.txt

dans le cas où vous devez copier un répertoire:

scp -r DIR_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp -r directory 172.17.0.2:directory

assurez-vous d'installer ssh dans votre conteneur.

apt-get install openssh-server
0
répondu gaetano 2016-08-29 11:34:13

Une chose que j'ai essayé et cela a fonctionné

une fois que vous avez fait tourner votre conteneur docker et si vous créez un fichier sous ce conteneur; vous pouvez facilement accéder à ce fichier à partir de l'emplacement ci-dessous de votre hôte docker: -

cd /var/lib/docker/aufs/conteneurs/container_id/tmp

essayez une fois!

0
répondu Harshal Vaidya 2017-08-02 10:00:21