Hoe kopieer ik bestanden van host naar Docker-container?

Ik probeer een back-up- en hersteloplossing te bouwen voor de Docker-containers waarmee we werken.

Ik heb een Docker-basisafbeelding die ik heb gemaakt, ubuntu:base, en ik wil deze niet elke keer opnieuw moeten opbouwen met een Docker-bestand om er bestanden aan toe te voegen.

Ik wil een script maken dat vanaf de hostcomputer wordt uitgevoerd en een nieuwe container maakt met behulp van de ubuntu:baseDocker-afbeelding en vervolgens bestanden naar die container kopieert.

Hoe kan ik bestanden van de host naar de container kopiëren?


Antwoord 1, autoriteit 100%

De opdracht cpkan worden gebruikt om bestanden te kopiëren.

Eén specifiek bestand kan NAAR de container worden gekopieerd, zoals:

docker cp foo.txt mycontainer:/foo.txt

Eén specifiek bestand kan UIT de container worden gekopieerd, zoals:

docker cp mycontainer:/foo.txt foo.txt

Ter nadruk: mycontaineris een containerID, nieteen imageID.

Meerdere bestanden in de map srckunnen worden gekopieerd naar de map targetmet:

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

Referentie: Docker CLI-documenten voor cp

In Docker-versies vóór 1.8 was het alleen mogelijk om bestanden van een container naar de host te kopiëren. Niet van de host naar een container.


Antwoord 2, autoriteit 6%

  1. Verkrijg containernaam of korte container-ID:

    $ docker ps
    
  2. Volledige container-ID ophalen:

    $ docker inspect -f   '{{.Id}}'  SHORT_CONTAINER_ID-or-CONTAINER_NAME
    
  3. Bestand kopiëren:

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

VOORBEELD:

$ 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

of

$ docker inspect -f   '{{.Id}}' d8e703d7e303
d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5
$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt

Antwoord 3, autoriteit 5%

De schoonste manier is om een hostdirectory op de container te koppelen bij het starten van de container:

{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

Antwoord 4, autoriteit 4%

Het volgende is een nogal lelijke manier om het te doen, maar het werkt.

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

Antwoord 5

Als u dit op een draaiende container moet doen, kunt u docker exec gebruiken (toegevoegd in 1.3).

Zoek eerst de naam of ID van de container:

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

In het bovenstaande voorbeeld kunnen we b9b7400ddd8fof elated_hodgkingebruiken.

Als je alles in /tmp/somefilesop de host naar /var/wwwin de container wilt kopiëren:

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

We kunnen dan /bin/bashin de container uitvoeren en controleren of het werkte:

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

Antwoord 6

Gewoonlijk zijn er drie soorten:

  1. Van een container naar de host

    docker cp container_id:./bar/foo.txt .
    

  1. Van de host naar een container

    docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    
  2. Tweede methode om van host naar container te kopiëren:

    docker cp foo.txt mycontainer:/foo.txt
    

  1. Van een container naar een container mixen 1 en 2

    docker cp container_id1:./bar/foo.txt .
    docker exec -i container_id2 sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    


Antwoord 7

  1. Maak een nieuw dockerbestand en gebruik de bestaande afbeelding als basis.

    FROM myName/myImage:latest
    ADD myFile.py bin/myFile.py
    
  2. Bouw vervolgens de container:

    docker build .
    

Antwoord 8

De oplossing wordt hieronder gegeven,

Vanuit de Docker-shell,

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

Van de host

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

Het bestand wordt direct gekopieerd naar de locatie waar de container op het bestandssysteem staat.


Antwoord 9

Een andere oplossing voor het kopiëren van bestanden naar een actieve container is het gebruik van tar:

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

Kopieert het bestand foo.shnaar /tmpvan de container.

Bewerken: verwijder overbodige -f, dankzij de opmerking van Maartens.


Antwoord 10

Een bestand kopiëren van host naar actieve container

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

Gebaseerd op Erik’s antwoorden de opmerkingen van Mikl en z0r.


Antwoord 11

Dit is een direct antwoord op de vraag ‘Bestanden kopiëren van host naar Docker-container’ die in deze vraag in de titel wordt gesteld.

Probeer docker cp. Het is de gemakkelijkste manier om dat te doen en werkt zelfs op mijn Mac. Gebruik:

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

Hiermee wordt het bestand some-file.txtin de directory /rootop uw hostcomputer gekopieerd naar de Docker-container met de naam some-docker-containerin de directory /root. Het komt heel dicht in de buurt van de veilige kopie-syntaxis. En zoals in het vorige bericht is te zien, kun je het andersom gebruiken. D.w.z. u kopieert ook bestanden van de container naar de host.

En voordat je dit bericht downlinkt, voer je docker cp --helpin. Het lezen van de documentatie kan soms erg nuttig zijn…

Als je dat niet leuk vindt en je wilt datavolumes in je reeds gemaakte en actieve container, dan is recreatie vandaag de enige optie. Zie ook Hoe kan ik een volume naar een bestaande Docker-container?.


Antwoord 12

Ik heb de meeste (upvoted) oplossingen hier geprobeerd, maar in docker 17.09 (in 2018) is er geen map /var/lib/docker/aufs meer.

Deze eenvoudige docker cpheeft deze taak opgelost.

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

Hoe kom ik aan container_name?

docker ps 

Er is een sectie NAMES. Gebruik geenIMAGE.


Antwoord 13

Met Docker 1.8 kan docker cpbestanden van host naar container kopiëren. Zie de Docker-blogpost Aankondiging van Docker 1.8: inhoudsvertrouwen, toolbox en updates voor register en orkestratie.


Antwoord 14

Om bestanden/mappen tussen een container en het lokale bestandssysteem te kopiëren, typt u het volgende commando:

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

Bijvoorbeeld

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

Om de contianer-ID te krijgen, typt u het gegeven commando:

docker ps

De bovenstaande inhoud is afkomstig van docker.com.


Antwoord 15

Ervan uitgaande dat de container al draait, typt u het gegeven commando:

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

Als u bestanden wilt delen met een gedeelde map, voert u de container uit door de opgegeven opdracht te typen:

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

Opmerking: er kunnen problemen optreden met machtigingen omdat de gebruikers van de container niet dezelfde zijn als de gebruikers van de host.


Antwoord 16

Dit is de opdracht om gegevens van Docker naar Host te kopiëren:

docker cp container_id:file path/filename /hostpath
docker cp a13fb9c9e674:/tmp/dgController.log /tmp/

Hieronder staat de opdracht om gegevens van host naar docker te kopiëren:

docker cp a.txt ccfbeb35116b:/home/

Antwoord 17

In een docker-omgeving zijn alle containers te vinden in de directory:

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

Om de brondirectory/het bronbestand naar een willekeurig deel van de container te kopiëren, typt u de gegeven opdracht:

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


Antwoord 18

De opdracht Docker cp is een handig hulpprogramma waarmee u bestanden en mappen tussen een container en het hostsysteem kunt kopiëren.

Als u bestanden van uw hostsysteem naar de container wilt kopiëren, moet u het docker cp-commando als volgt gebruiken:

docker cp host_source_path container:destination_path

Laat eerst uw actieve containers zien met het docker ps-commando:

abhishek@linuxhandbook:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              
  PORTS               NAMES
  8353c6f43fba        775349758637        "bash"              8 seconds ago       Up 7 
  seconds                            ubu_container

U moet de container-ID of de containernaam weten. In mijn geval is de naam van de docker-container ubu_container. en de container-ID is 8353c6f43fba.

Als u wilt controleren of de bestanden met succes zijn gekopieerd, kunt u uw container op de volgende manier invoeren en vervolgens reguliere Linux-commando’s gebruiken:

docker exec -it ubu_container bash

Kopieer bestanden van hostsysteem naar dockercontainer
Kopiëren met docker cp is vergelijkbaar met het kopieercommando in Linux.

Ik ga een bestand met de naam a.py naar de map home/dir1 in de container kopiëren.

docker cp a.py ubu_container:/home/dir1

Als het bestand met succes is gekopieerd, ziet u geen uitvoer op het scherm. Als het bestemmingspad niet bestaat, ziet u een fout:

abhishek@linuxhandbook:~$ sudo docker cp a.txt ubu_container:/home/dir2/subsub
        Error: No such container:path: ubu_container:/home/dir2

Als het doelbestand al bestaat, wordt het zonder enige waarschuwing overschreven.

U kunt ook container-ID gebruiken in plaats van de containernaam:

docker cp a.py 8353c6f43fba:/home/dir1

Antwoord 19

Als de host CentOS of Fedora is, is er een proxy NIET in /var/lib/docker/aufs, maar deze staat onder /proc:

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

Deze cmd kopieert alle inhoud van de datadirectory naar /van de container met id “containerid”.


Antwoord 20

taren docker cpzijn een goede combinatie om alles in een directory te kopiëren.

Maak een datavolumecontainer

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

Om de directoryhiërarchie te behouden

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

Controleer je werk

docker run --rm --volumes-from dvc cirros ls -al /path/on/container

Antwoord 21

In het geval dat het voor iemand zoals ik niet duidelijk is wat mycontainerin @h3nrik antwoord betekent, is het eigenlijk de container-ID. Om een bestand WarpSquare.mp4in /app/example_scenes/1440p60van een afgesloten docker-container naar de huidige map te kopiëren, heb ik dit gebruikt.

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

waar docker ps -q -lde container-id van de laatst afgesloten instantie ophaalt. Als het geen verlaten container is, kunt u deze verkrijgen via docker container lsof docker ps


Antwoord 22

docker cp SRC_PATH CONTAINER_ID:DEST_PATH

Ik wil bijvoorbeeld mijn bestand xxxx/download/jenkins naar Tomcat kopiëren

Ik krijg de id van de container Tomcat

docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
63686740b488        tomcat              "catalina.sh run"   12 seconds ago      Up 11 seconds       0.0.0.0:8080->8080/tcp   peaceful_babbage
docker cp xxxx/download/jenkins.war  63686740b488:usr/local/tomcat/webapps/

Antwoord 23

Container Up-syntaxis:

docker run -v /HOST/folder:/Container/floder 

In docker-bestand

COPY hom* /myFolder/        # adds all files starting with "hom"
COPY hom?.txt /myFolder/    # ? is replaced with any single character, e.g., "home.txt"

Antwoord 24

Veel die deze vraag vinden, kunnen daadwerkelijk het probleem hebben van het kopiëren van bestanden in een Docker-afbeelding terwijl het wordt gemaakt (dat deed).

In dat geval kunt u de COPYopdracht in de Dockerfiledie u gebruikt om de afbeelding te maken.

Zie de documentatie .


Antwoord 25

U kunt het IP-adres van uw lokale apparaat gewoon volgen met

ifconfig

Voer vervolgens gewoon uw Docker Container in en typ

scp user_name@ip_address:/path_to_the_file destination

In elk geval als u geen SSH-client en server hebt geïnstalleerd, installeert u deze gewoon met:

sudo apt-get install openssh-server

Antwoord 26

Dit is een onliner voor het kopiëren van een enkel bestand tijdens het draaien van een tomcat-container.

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

Hiermee kopieert u het WAR-bestand naar WebAPPS-directory en ontvangt u uw app in een mum van tijd.


Antwoord 27

Mijn favoriete methode:

Containers:

CONTAINER_ID=$(docker ps | grep <string> | awk '{ print $1 }' | xargs docker inspect -f '{{.Id}}')

bestand.txt

mv -f file.txt /var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/root/file.txt

of

mv -f file.txt /var/lib/docker/aufs/mnt/$CONTAINER_ID/rootfs/root/file.txt

Antwoord 28

De beste manier voor het kopiëren van bestanden naar de vond Container die een map op host monteert met -voptie van Docker Run-opdracht.


Antwoord 29

Er zijn goede antwoorden, maar te specifiek. Ik kom erachter dat docker pseen goede manier is om een container-ID te krijgen waarin je geïnteresseerd bent. Doe dat dan

mount | grep <id>

om te zien waar het volume is gekoppeld. Dat is

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

voor mij, maar het kan een ander pad zijn, afhankelijk van het besturingssysteem en de configuratie. Kopieer nu gewoon bestanden naar dat pad.

Het gebruik van -vis niet altijd praktisch.


Antwoord 30

Ik ben net begonnen met het gebruik van docker om VLC te compileren, dit is wat je kunt doen om bestanden heen en weer te kopiëren vanuit containers:

su -
cd /var/lib/docker
ls -palR > /home/user/dockerfilelist.txt

Zoek naar een bekend bestand in die txt en je hebt de map, cd ernaartoe als root en voila! kopieer alles wat je wilt.

Misschien is er een pad met “merged” erin, ik denk dat je het pad met “diff” erin wilt hebben.

Ook als u de container verlaat en weer terug wilt waar u was gebleven:

docker ps -a
docker start -i containerid

Ik denk dat dat handig is als je niets hebt genoemd met een commando als

docker run -it registry.videolan.org:5000/vlc-debian-win64 /bin/bash

Natuurlijk de hackermethode, maar wat dan nog!

Other episodes