Copia di file dall'host al contenitore Docker


Answers

  1. Ottieni nome contenitore o ID contenitore breve:

    $ docker ps
    
  2. Ottieni l'ID contenitore completo:

    $ docker inspect -f   '{{.Id}}'  SHORT_CONTAINER_ID-or-CONTAINER_NAME
    
  3. Copia il file:

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

ESEMPIO:

$ 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

o

$ docker inspect -f   '{{.Id}}' d8e703d7e303

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt
Question

Sto cercando di creare una soluzione di backup e ripristino per i contenitori Docker con cui lavoriamo.

Ho un'immagine di base Docker che ho creato, ubuntu:base , e non voglio doverla ricostruire ogni volta con un file Docker per aggiungere file ad esso.

Voglio creare uno script che viene eseguito dalla macchina host e crea un nuovo contenitore usando l' ubuntu:base immagine Docker e quindi copia i file in quel contenitore.

Come posso copiare file dall'host al contenitore?




Per copiare un file dall'host al contenitore funzionante

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

Basato sulla risposta di Erik e sui commenti di Mikl's e z0r.




Per copiare file / cartelle tra un contenitore e il filesystem locale, digita il comando:

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

Per esempio,

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

Per ottenere l'id contianer, digitare il comando dato:

docker ps

Il contenuto di cui sopra è preso da docker.com .




tar e docker cp sono una buona combinazione per copiare tutto in una directory.

Creare un contenitore del volume di dati

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

Per preservare la gerarchia della directory

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

Controlla il tuo lavoro

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



Se l'host è CentOS o Fedora, c'è un proxy NON in /var/lib/docker/aufs , ma è sotto /proc :

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

Questo cmd copierà tutti i contenuti della directory dei data su / di container con id "containerid".




Ci sono buone risposte, ma troppo specifiche. Trovo che docker ps è un buon modo per ottenere l'ID contenitore a cui sei interessato. Allora fallo

mount | grep <id>

per vedere dove è montato il volume. Quello è

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

per me, ma potrebbe essere un percorso diverso a seconda del sistema operativo e della configurazione. Ora semplicemente copia i file su quel percorso.

Usare -v non è sempre pratico.




Generalmente creo server python usando questo comando

python -m SimpleHTTPServer

nella directory specifica e quindi utilizzare semplicemente wget per trasferire il file nella posizione desiderata nella finestra mobile. So che non è il modo migliore per farlo, ma lo trovo molto più facile.




Supponendo che il contenitore sia già in esecuzione, digita il comando specificato:

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

Per condividere file utilizzando la directory condivisa, esegui il contenitore digitando il comando specificato:

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

Nota: potrebbero sorgere problemi con le autorizzazioni in quanto gli utenti del contenitore non sono gli stessi degli utenti dell'host.




La soluzione è data sotto,

Dalla shell Docker,

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

Dall'host

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

Il file deve essere copiato direttamente nella posizione in cui il contenitore si trova sul filesystem.




Semplicemente copio il file direttamente da dove si trova il contenitore dal computer host.

Per esempio:

Per prima cosa scopri l'id del contenitore:

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

E poi dall'host, diciamo che il file si trova nella home directory:

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

Torna al contenitore ...

root@**3aed62678d54**:/home# ls cheering_nasa.gif



Avrei montato e poi eseguito l'immagine con un demone, proprio come dato qui;

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

poi

docker exec -it mntcontainer bash



Quello che segue è un modo abbastanza brutto di farlo, ma funziona.

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



Dove non si ha una directory definita come volume nel Dockerfile, il file / var / lib / docker / aufs / mnt // funzionerà. Ma ci sono casi in cui la directory all'interno del contenitore è definita come un volume. In questo caso, i contenuti sotto aufs / mnt / * / e il contenuto visto dal contenitore sono diversi.

Dovrai ispezionare il container usando la finestra mobile inspect e quindi cercare i volumi. Lì troverai una menzione per qualcosa come / var / lib / docker / vfs / dir / fe940b ... (l'id). Sarà necessario aggiungere / modificare i file qui anziché sotto aufs / mnt / *.

La parte confusa è che i file appaiono anche in / aufs / mnt / *. Ho passato un po 'di tempo a grattarmi la testa perché i cambiamenti qui non funzionavano per me. Spero che questo aiuti qualcuno.







Una cosa che ho provato e ha funzionato

Una volta che fai girare il tuo contenitore docker e se crei qualsiasi file sotto quel contenitore; È possibile accedere facilmente a tale file dal percorso sottostante dell'host di docker: -

cd / var / lib / docker / aufs / containers / id_contenitore / tmp

Prova una volta!