Copia di file dall'host al contenitore Docker




15 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
docker docker-container

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?




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

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



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.




Molto facile

  1. Crea un nuovo file docker e utilizza l'immagine esistente come base.

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. Quindi crea il contenitore:

    docker build .
    






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 .




In un ambiente finestra mobile, tutti i contenitori si trovano nella directory:

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

Per copiare la directory / il file sorgente in qualsiasi parte del contenitore, digita il comando specificato:

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




Puoi semplicemente tracciare l'indirizzo IP della tua macchina locale usando

ifconfig

Quindi entra nel tuo contenitore Docker e digita

scp user_name@ip_address:/path_to_the_file destination

In ogni caso se non hai un client SSH e un server installato, basta installarlo usando:

sudo apt-get install openssh-server



Molti di quelli che trovano questa domanda potrebbero effettivamente avere il problema di copiare i file in un'immagine Docker mentre vengono creati (io l'ho fatto).

In tal caso, è possibile utilizzare il comando COPY nel file Dockerfile che si utilizza per creare l'immagine.

Vedi la documentazione .




Il modo migliore per copiare i file nel contenitore che ho trovato è montare una directory sull'host usando l'opzione -v del comando di esecuzione docker.




Nel caso in cui non sia chiaro a qualcuno come me cosa significa mycontainer in @ h3nrik, è in realtà l'id del contenitore. Per copiare un file WarpSquare.mp4 in /app/example_scenes/1440p60 da un container mobile uscito nella cartella corrente, l'ho usato.

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

dove la docker ps -q -l richiama l'id contenitore dell'ultima istanza uscita. Nel caso in cui non si tratti di un contenitore uscito, è possibile ottenerlo tramite il docker container ls o la docker ps




Se si utilizza Windows come host, è possibile utilizzare WinSCP per connettersi a Docker e trasferire i file tramite la GUI.

Se su Linux, il comando scp funzionerebbe anche attraverso il terminale.




Sintassi Container Up:

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

Nel file di finestra mobile

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



Il mio metodo preferito:

CONTENITORI:

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

file.txt

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

o

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



Un'altra soluzione consiste nell'usare il buon vecchio scp . Questo è utile nel caso in cui sia necessario copiare una directory.

Dalla tua esecuzione dell'host:

scp FILE_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp foo.txt 172.17.0.2:foo.txt

Nel caso in cui è necessario copiare una directory:

scp -r DIR_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp -r directory 172.17.0.2:directory

assicurati di installare ssh nel tuo contenitore.

apt-get install openssh-server



Related