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?
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.
-
obtenir le nom du conteneur ou le numéro d'identification du conteneur court:
$ docker ps
-
obtenir le numéro d'identification du conteneur complet:
$ docker inspect -f '{{.Id}}' SHORT_CONTAINER_ID-or-CONTAINER_NAME
-
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
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
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
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
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.
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.
très facile
-
créez un nouveau fichier dockerfile et utilisez l'image existante comme base.
FROM myName/myImage:latest ADD myFile.py bin/myFile.py
-
puis construire le conteneur:
docker build .
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.
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 .
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? .
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.
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/
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 .
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
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
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
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.
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".
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.
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.
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
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.
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 .
où 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
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.
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
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
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
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!