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?




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.




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



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



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.




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



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!




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.




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.




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.




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".




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 .







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

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



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.




Links



Tags

docker docker