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:base
Docker-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 cp
kan 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: mycontainer
is een containerID, nieteen imageID.
Meerdere bestanden in de map src
kunnen worden gekopieerd naar de map target
met:
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%
-
Verkrijg containernaam of korte container-ID:
$ docker ps
-
Volledige container-ID ophalen:
$ docker inspect -f '{{.Id}}' SHORT_CONTAINER_ID-or-CONTAINER_NAME
-
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 b9b7400ddd8f
of elated_hodgkin
gebruiken.
Als je alles in /tmp/somefiles
op de host naar /var/www
in de container wilt kopiëren:
$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www
We kunnen dan /bin/bash
in 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:
-
Van een container naar de host
docker cp container_id:./bar/foo.txt .
-
Van de host naar een container
docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
-
Tweede methode om van host naar container te kopiëren:
docker cp foo.txt mycontainer:/foo.txt
-
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
-
Maak een nieuw dockerbestand en gebruik de bestaande afbeelding als basis.
FROM myName/myImage:latest ADD myFile.py bin/myFile.py
-
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.sh
naar /tmp
van 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.txt
in de directory /root
op uw hostcomputer gekopieerd naar de Docker-container met de naam some-docker-container
in 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 --help
in. 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 cp
heeft 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 cp
bestanden 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 data
directory naar /
van de container met id “containerid”.
Antwoord 20
tar
en docker cp
zijn 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 mycontainer
in @h3nrik antwoord betekent, is het eigenlijk de container-ID. Om een bestand WarpSquare.mp4
in /app/example_scenes/1440p60
van 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 -l
de container-id van de laatst afgesloten instantie ophaalt. Als het geen verlaten container is, kunt u deze verkrijgen via docker container ls
of 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 COPY
opdracht in de Dockerfile
die u gebruikt om de afbeelding te maken.
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 -v
optie van Docker Run-opdracht.
Antwoord 29
Er zijn goede antwoorden, maar te specifiek. Ik kom erachter dat docker ps
een 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 -v
is 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!