Am încercat să construiască o copie de rezervă și restaurare soluție pentru Docker containere, cu care lucrăm.
Am Docker bază de imagine pe care am creat-o, `ubuntu:de bază, și nu vreau să o refacem de fiecare dată cu un Docher fișier pentru a adăuga fișiere la ea.
Vreau sa creez un script care ruleaza de la mașina gazdă și creează un nou container folosind ubuntu:base` Docker imagine și apoi copiază fișierele în acel container.
Cum pot copia fișiere de la gazdă la container?
La cp
comandă poate fi folosit pentru a copia fișierele.
Un anumit fișier poate fi copiat LA container, cum ar fi:
docker cp foo.txt mycontainer:/foo.txt
Un anumit fișier poate fi copiat DE pe container, cum ar fi:
docker cp mycontainer:/foo.txt foo.txt
Pentru accent, mycontainer
este un container ID, nu o image ID.
Mai multe fișiere conținute de dosarul src` pot fi copiate în `țintă
folder folosind:
docker cp src/. mycontainer:/target
docker cp mycontainer:/src/. target
Referință: Docker CLI docs pentru cp
În Docker versiunile anterioare de 1.8 a fost posibil doar pentru a copia fișiere de la un container la gazdă. Nu de la gazdă la un container.
$ docker ps
$ docker controlați -f '{{.Id}}' SHORT_CONTAINER_ID-sau-CONTAINER_NAME
$ sudo cp calea-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/CALEA-NOU-DOSAR
$ 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
sau
$ docker inspect -f '{{.Id}}' d8e703d7e303
d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5
$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt
Cea mai simpla metoda este de a monta un director gazdă pe recipient atunci când începe 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
Dacă aveți nevoie pentru a face acest lucru de pe recipient se poate folosi docker exec (adăugat în 1.3).
În primul rând, găsi container's numele sau ID-ul:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9b7400ddd8f ubuntu:latest "/bin/bash" 2 seconds ago Up 2 seconds elated_hodgkin
În exemplul de mai sus, putem folosi fie b9b7400ddd8f " sau " elated_hodgkin
.
Dacă ai vrut pentru a copia totul în /tmp/somefiles pe gazdă să -
/var/www` în container:
$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www
Putem apoi exec /bin/bash
în container și verificați dacă acesta a lucrat:
$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1 file2
Soluția este prezentată mai jos,
root@123abc:/root# <-- get the container ID
cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root
Fișierul trebuie să fie copiate direct la locația în care recipientul se așează pe sistemul de fișiere.
DE la myName/myImage:cele mai noi
ADAUGA myFile.py bin/myFile.py
docker construi .
O altă soluție pentru copierea fișierelor într-un recipient de funcționare este folosind tar:
tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x
Copiază fișierul foo.sh
în "/tmp " a containerului.
Edit: Elimina reduntant -f
, datorită Maartens comenteze.
De obicei, există trei tipuri:
docker cp container_id:./bar/foo.txt .
docker exec-am container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
docker cp container_id1:./bar/foo.txt .
docker exec-am container_id2 sh -c 'cat > ./bar/foo.txt' < ./foo.txt
Cu Docker 1.8, `docker cp este capabil de a copia fișiere de la gazdă la container. Vezi Docker blog post Anunțând Docker 1.8: Conținut de Încredere, Instrumente, și Actualizări de Registry și Orchestrație.
Acesta este un răspuns direct la întrebarea 'Copierea fișierelor de gazdă pentru Docker container' a crescut în această întrebare în titlu.
Încerca docker cp
. Acesta este cel mai simplu mod de a face asta și funcționează chiar și pe Mac-ul meu. Utilizare:
docker cp /root/some-file.txt some-docker-container:/root
Aceasta va copia fișierul some-file.txt
din directorul /root
pe mașina gazdă în Docker container numit unele-docker container-
in directorul /root
. Este foarte aproape de secure copy sintaxă. Și cum am aratat in postul anterior, puteți să-l utilizați vice-versa. I. e., ai, de asemenea, să copiați fișiere din recipient la gazdă.
Și înainte de preluare de acest post, vă rugăm să introduceți docker cp --help
. Citirea documentației poate fi foarte util, uneori...
Dacă tu nu't așa și vrei volume de date în ta deja creat și funcționare recipient, apoi recreere este singura ta opțiune de astăzi. A se vedea, de asemenea, Cum pot adauga un volum existent Docker container?.
Am încercat cele mai multe (upvoted) soluții aici, dar în docker 17.09 (în 2018) nu mai este /var/lib/docker/aufs folder.
Acest simplu docker cp
a rezolvat această sarcină.
docker cp c:\path\to\local\file container_name:/path/to/target/dir/
Cum să obțineți container_name?
docker ps
Acolo este un NUME de secțiune. Don't folosi o "IMAGINE".
Pentru a copia fișiere/foldere între recipient și sistemul de fișiere local, tastați comanda:
docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}
De exemplu,
docker cp /home/foo container-id:/home/dir
Pentru a obține contianer id, introduceți-a dat comanda:
docker ps
Conținutul de mai sus este preluat din docker.com.
Presupunând recipientul este deja în execuție, tipul de date de comandă:
# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"
Pentru a partaja fișiere folosind comună director, executați recipient prin tastarea-a dat comanda:
# docker run -v /path/to/host/dir:/path/to/container/dir ...
Notă: Probleme cu permisiunile ar putea apărea ca recipient's utilizatori nu sunt aceleași ca și gazdă's de utilizatori.
Într-un docher mediu, toate containerele sunt găsite în directorul:
Pentru a copia sursa de director/fișier la orice parte din container, tip dat comanda:
Aceasta este comanda pentru a copia datele din Docker pentru a Găzdui:
docker cp container_id:file path/filename /hostpath
docker cp a13fb9c9e674:/tmp/dgController.log /tmp/
Mai jos este comanda pentru a copia date de la gazdă la docker:
docker cp a.txt ccfbeb35116b:/home/
tar " și " docker cp
sunt o combinație bună pentru copierea totul într-un director.
A crea un volum de date container
docker create --name dvc --volume /path/on/container cirros
Pentru a păstra director ierarhie
tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container
Verifica munca ta
docker run --rm --volumes-from dvc cirros ls -al /path/on/container
În cazul în care nu este clar pentru cineva ca mine ce mycontainer în @h3nrik răspuns înseamnă, de fapt este recipientul de identitate. Pentru a copia un fișier
WarpSquare.mp4 " în " /app/example_scenes/1440p60` de la o ieșit docker container pentru dosarul curent.am folosit asta.
docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .
unde docker ps-q-l trage în sus recipientul id-ul de ultima ieșit exemplu. În cazul în care acesta nu este o ieșit recipient puteți să-l de docker container ls " sau " docker ps
Dacă gazda este CentOS sau Fedora, există un proxy NU în /var/lib/docker/aufs
, dar este sub /proc
:
cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root
Acest cmd va copia tot conținutul de "date" directorul a /
de recipient cu id-ul "containerid".