Come copiare file con Docker cp nel tuo container Docker

Se hai bisogno di copiare file dall’host Docker al tuo container Docker, questo tutorial fa al caso tuo.

In questo tutorial imparerai a copiare file dall’host Docker a un container Docker utilizzando vari approcci.

Cominciamo!

Prerequisiti

Se vuoi seguire passo dopo passo, assicurati di avere quanto segue:

  • Docker installato sull’host Linux. Questo tutorial utilizza Docker v19.03.11. Puoi confermare la tua versione di Docker eseguendo docker version.

Copiare i File con il Comando docker cp

Per iniziare questo tutorial, imparerai a copiare file dall’host Docker ai container utilizzando il comando docker cp. Il comando docker cp copia file o cartelle tra un container e il filesystem locale del tuo host Docker e viceversa.

Impariamo come utilizzare il comando Docker cp con un esempio.

1. Apri un terminale sulla tua macchina locale.

2. Crea un file chiamato myfile.txt usando il comando touch. Il myfile.txt sarà copiato dall’host Docker al contenitore.

touch myfile.txt

3. Esegui il comando docker run. Il seguente docker run creerà un nuovo contenitore in background. Il comando contiene tre parametri descritti di seguito:

  • d flag that runs the container in the background and keeps it alive until deleted.
  • p flag publishes a container’s port 80 to the host on port 80.
  • nginx sarà l’immagine utilizzata per eseguire il contenitore.
sudo docker run -d -p 80:80 nginx
Executing the Docker run command

4. Verifica se il contenitore Docker è stato creato con successo utilizzando il comando docker ps. Dopo aver eseguito il comando docker ps, dovresti vedere un nuovo valore generato nell’attributo CONTAINER ID (Nel caso sottostante ccae4670f030) utilizzando l’immagine NGINX che conferma che il contenitore è stato creato con successo.

sudo docker ps
Verifying the docker container by running the docker ps command

Prima di eseguire il comando Docker cp, la sintassi del comando Docker cp è:

  • CONTAINER: SRC_PATH specifica il percorso di origine del contenitore.
  • DEST_PATH è il percorso di destinazione sull’host.
  • CONTAINER: DEST_PATH è il percorso di destinazione sul contenitore.

Inoltre, puoi anche aggiungere le opzioni con i seguenti parametri nel comando come segue:

  • Usando l’opzione archive o a, si copiano tutti i permessi utente e del gruppo principale dei file e delle cartelle.
  • Utilizzando l’opzione L, specificare questa opzione consentirà la copia di qualsiasi collegamento simbolico nel percorso di origine al percorso di destinazione.
# Sintassi per copiare dal contenitore all'host Docker
docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
# Sintassi per copiare dall'host Docker al contenitore
docker cp {options} SRC_PATH CONTAINER:DEST_PATH 

5. Successivamente, eseguire il comando docker cp. Il comando docker cp copierà il file myfile.txt creato in precedenza nella directory /usr/share del contenitore. ccae4670f030 è l’ID del contenitore a cui sarà copiato il file myfile.txt.

sudo docker cp myfile.txt ccae4670f030:/usr/share

6. Infine, accedere al contenitore in esecuzione eseguendo il comando docker exec con /bin/bash, utilizzato come shell predefinita per il login dell’utente nel sistema Linux.

  • Il flag i indica che si desidera aprire una sessione SSH interattiva nel contenitore. Il flag i non chiude la sessione SSH anche se il contenitore non è collegato.
  • Il flag t alloca una pseudo-TTY che deve essere utilizzata per eseguire comandi in modo interattivo.sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash

Vedrai qui sotto di essere ora connesso alla shell del contenitore quando esegui docker exec.

SSH into the running container using docker exec command

7. Dopo aver effettuato l’accesso al contenitore, verifica se myfile.txt è stato copiato nel contenitore utilizzando il comando ls.

  • ls è un comando per elencare i file del computer nei sistemi operativi Unix e simili a Unix.
  • grep cercherà tutti i file o le cartelle che iniziano con la stringa my all’interno della directory usr/share.
Verifying the files in the container

Copiare i file usando il DockerFile

Nella sezione precedente, hai imparato come copiare i file nel contenitore eseguendo il comando Docker cp. Cosa fare se è necessario copiare più file in una volta? Certamente, eseguire più comandi diventa un onere! Per risolvere l’esecuzione di più comandi cp, perché non provare a copiare file o cartelle nei contenitori utilizzando il Dockerfile con i comandi COPY?

Il deploy di un contenitore e la copia dei file/cartelle utilizzando il Dockerfile ti consentono di rimuovere i passaggi di copia manuali eseguiti nella sezione precedente. Un Dockerfile è un documento di testo che contiene tutti i comandi che un utente potrebbe chiamare da riga di comando per assemblare un’immagine.

Creiamo un Dockerfile, eseguiamo un contenitore da esso e infine copiamo i file.

1. Crea una cartella chiamata ~/host-to-container-copy-demo, quindi cambia (cd) la directory di lavoro in quella cartella. Questa cartella conterrà tutti i file che creerai in questa demo.

mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo

2. Ora, crea due file di testo denominati myfile1.txt e myfile2.txt, copia e incolla il loro contenuto nei file e salvali nella directory ~/host-to-container-copy-demo.

# myfile1.txt
Hello This is my first file !
This is file will be copied in /usr/share directory from Docker host to Docker Container.
# myfile2.txt
Hello This is my second file !
This is file will be copied in /tmp directory from Docker host to Docker Container.

3. Creare un altro file, copiare/incollare la configurazione sottostante e salvare il file come Dockerfile all’interno della directory ~/host-to-container-copy-demo. Quando completo, Docker utilizzerà questo DockerFile per eseguire tutti i comandi necessari per creare una nuova immagine Docker sopra a qualsiasi immagine di base.

Il DockerFile sottostante contiene varie istruzioni che costruiranno il nuovo container:

  • FROM L’istruzione FROM inizializza una nuova fase di compilazione e imposta l’immagine di base per le istruzioni successive.
  • COPY Il comando COPY copia un file dalla macchina host (host Docker) al container.
# Istruzione per il Dockerfile per creare una nuova immagine sopra l'immagine di base (ubuntu)
# Utilizzando l'immagine di base ubuntu: latest
FROM ubuntu:latest
# Copia myfile1.txt nella directory /usr/share del container
COPY myfile1.txt /usr/share
# Copia myfile2.txt nella directory /tmp del container
COPY myfile2.txt /tmp

4. Verifica tutti i file necessari per costruire la nuova immagine eseguendo il comando tree. Dovresti vedere Dockerfile, myfile1.txt e myfile2.txt sotto la directory ~/host-to-container-copy-demo.

Verifies files and folders using tree command

5. Successivamente, costruisci l’immagine eseguendo il comando docker build. Il flag t viene utilizzato per etichettare l’immagine updated_ubuntu_image con il latest e . consente a Docker di selezionare tutti i file necessari dalla directory di lavoro attuale.

sudo docker build -t updated_ubuntu_image:latest .
Building the Docker image by running the docker build command

6. Ora, verifica la nuova immagine costruita updated_ubuntu_image eseguendo il comando docker images. Nota l’attributo REPOSITORY. Questo attributo è il tag creato con il flag -t nel passaggio precedente.

sudo docker images
Repository Attribute

7. Infine, esegui il container Docker utilizzando la nuova immagine appena creata eseguendo il comando docker run. Il flag -it istruisce Docker ad allocare un pseudo-terminal connesso allo stdin del container. bash fornisce la shell predefinita per l’accesso dell’utente al sistema Linux.

sudo docker run -it updated_ubuntu_image bash

Vedrai di seguito di essere ora nella shell Bash del container Docker.

Running the container using docker run command.

8. Successivamente, verifica se i file sono stati copiati con successo sul container nelle directory /tmp e /usr/share eseguendo il comando ls.

Verifying the files if they are successfully copied on the container

Montaggio di un Volume di Archiviazione e Accesso ai File con il Comando Docker Volume

Fino a questo momento, hai imparato come copiare i file dall’host al container utilizzando due approcci diversi: usando il comando docker cp e un DockerFile. Questa volta, impariamo come condividere facilmente i sistemi di file tra l’host e i container usando il comando docker volume.

Assumendo che tu sia ancora connesso al terminale:

1. Crea un volume sull’host Docker eseguendo il comando docker volume create. Il comando seguente creerà un volume chiamato my-vol. sudo docker volume create my-vol

sudo docker volume create my-vol

2. Verifica che il volume sia stato creato con successo eseguendo il comando docker volume ls. Il comando docker volume ls elenca il volume. Dopo aver eseguito il comando docker volume ls, vedrai my-vol nell’attributo VOLUME NAME che conferma la corretta creazione del volume.

sudo docker volume ls
Listing the docker volumes

3. Successivamente, esegui il container usando il comando docker run.

  • Il container chiamato volume_testing utilizza l’immagine nginx: latest.
  • d flag runs the container in the background and keeps it alive until deleted.
  • v flag mounts the volume my-vol created on Docker host to the container’s destination /app directory.
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
Running the Docker command and attaching the volume with the container

4. Verifica se il volume my-vol creato in precedenza è montato correttamente nel contenitore usando il comando docker inspect. Il comando Docker inspect fornisce le informazioni sul contenitore. Dopo aver eseguito il comando docker inspect, verranno visualizzati tutti i dettagli del contenitore specificato (volume_testing), compresi i dettagli del mount, come mostrato di seguito.

sudo docker inspect volume_testing

Di seguito, lo snapshot dell’immagine conferma che il volume (my-vol) creato sull’host è montato con successo nella directory /app del contenitore.

Verifying the volumes in the container

Conclusione

In questo tutorial, hai appreso diversi modi per copiare file o cartelle dall’host Docker ai contenitori, come l’uso del comando Docker cp, i comandi dei volumi Docker e il Dockerfile.

Quale approccio sceglierai per copiare dati dall’host ai contenitori Docker?

Source:
https://adamtheautomator.com/docker-cp/