Come utilizzare Docker Cp per copiare file tra host e contenitori

0
443

Devi inserire o estrarre alcuni file da un container Docker? Il comando docker cp ti consente di copiare tra filesystem host e container in modo da poter aggiungere dettagli di configurazione, creare backup e ripristinare dati esistenti.

Sintassi di base

docker cp accetta i percorsi di origine e destinazione come suoi due argomenti:

docker cp example.txt my-container:/example.txt

Qui example.txt viene copiato dalla directory di lavoro in /example.txt nel contenitore mio-contenitore. Puoi invertire i due argomenti per copiare /example.txt dal contenitore e nella tua directory di lavoro.

L'argomento che fa riferimento al percorso del contenitore deve essere preceduto da un ID o da un nome del contenitore seguito da due punti (:). Puoi trovare l'ID o il nome di un container in esecuzione con docker ps.

Annuncio

Ogni comando docker cp richiede un percorso del filesystem locale e un percorso del contenitore – non puoi copiare direttamente tra due contenitori. Utilizzare una procedura a più passaggi se è necessario eseguire questa operazione, copiando prima dal contenitore di origine al filesystem, quindi dal nuovo percorso locale al contenitore di destinazione.

Copiare intere directory

docker cp può anche copiare ricorsivamente le directory:

docker cp /home/demo/website apache-container:/var/www /html/.

Docker copierà tutto in /home/demo/website e lo trasferirà in /var/www/html.

Copia comportamento

Quando copi un file, Docker crea un nuovo file nella destinazione se non esiste già. I file esistenti vengono sovrascritti con il nuovo contenuto. Quando la destinazione è una directory, il file viene copiato in essa utilizzando il nome del file di origine. Un'eccezione è quando la destinazione specificata termina con una /, che indica una directory, ma il percorso non esiste già. In questo scenario verrà generato un errore.

Il processo è un po' più complicato per le copie di directory. Verrà creata una nuova directory nella destinazione con il contenuto della directory di origine, se il percorso di destinazione non esiste già. Quando esiste, il comportamento varia a seconda che tu abbia incluso o meno una /. componente nel percorso.

  • /. è presente – La directory di origine viene copiata nella directory di destinazione esistente.
  • /. non è presente – Il contenuto della directory di origine viene copiato nella destinazione.

La sottile distinzione determina se viene creata una nuova sottodirectory all'interno della destinazione.

Limitazioni dei comandi

Nonostante il suo nome, docker cp non è un'implementazione completa del comando cp shell. I flag cp non sono supportati, ad eccezione di -a e -L:

  • -a – Modalità di archiviazione, che conserva i dettagli dell'utente e del gruppo sui file copiati.
  • -L – Segui i collegamenti simbolici nella directory di origine per copiare i contenuti delle destinazioni dei collegamenti, anziché i collegamenti stessi.

Per casi d'uso più avanzati in cui è richiesta la copia selettiva, dovrai ricorrere a un approccio diverso.

Uso dei montaggi di associazione per copiare file

I volumi Docker forniscono un altro modo per spostare i file tra i contenitori e il tuo host. Il montaggio di bind di una directory locale in un contenitore ti consente di accedere al suo contenuto dal filesystem host, eliminando la necessità di utilizzare docker cp.

docker run -v /example/host/directory:/container/path my-image:latest Pubblicità

I contenuti del percorso /example/host/directory sono montati nel filesystem del contenitore in /container/path. Puoi interagire con questi file al di fuori di Docker utilizzando strumenti familiari come cp, rsync e il tuo browser di file grafico.

Questa tecnica è utile solo quando lavori con una singola directory contenitore. Non funziona bene quando si copia da posizioni arbitrarie poiché è necessario conoscere i percorsi che verranno utilizzati in anticipo, quando viene creato il contenitore.

Dovresti anche diffidare dei permessi del filesystem: i file creati all'interno del contenitore saranno solitamente di proprietà di root. Ciò può creare scenari imbarazzanti sull'host in cui non è possibile modificare o eliminare i file all'interno della directory associata. Usa il comando chown sull'host e all'interno del contenitore per cambiare la proprietà in base all'ambiente, se necessario.

Che ne dici di COPY in Dockerfiles?

docker cp può a volte essere confuso con l'istruzione COPY in Dockerfiles. È importante riconoscere che queste due funzionalità servono casi d'uso molto diversi.

COPY non può essere utilizzato per spostare file tra il tuo host e un contenitore in esecuzione. Serve per inserire i file nelle immagini durante il processo di compilazione:

COPY /home/me/my-website /var/www/html/. Pubblicità

Qui il codice sorgente del sito web viene copiato in un'immagine come parte di una build. Questo è un processo una tantum. Ogni contenitore avviato dall'immagine includerebbe l'origine del sito Web così com'era al momento dell'esecuzione della build docker.

docker cp ti consente di sostituire quel codice sorgente con una versione più recente una volta che un contenitore è in esecuzione. Le istruzioni COPY servono a rendere i file parte di un'immagine statica; cp interagiscono con i contenitori live.

Quando copiare file con Docker?

La copia manuale dei file dal tuo host a un container Docker, o viceversa, dovrebbe essere un'evenienza relativamente rara. Le immagini sono pensate per essere autosufficienti, quindi dovrebbero essere fornite con tutto il necessario per avviare un'istanza. La configurazione viene solitamente gestita tramite variabili di ambiente.

I contenitori che devono archiviare dati in modo permanente dovrebbero utilizzare i volumi Docker. I volumi consentono ai dati di sopravvivere a qualsiasi singolo contenitore, quindi non è necessario dockerare manualmente cp prima di sostituire un'istanza. Quando esegui i backup, copia i volumi dal tuo host, invece di estrarre i file dai contenitori.

docker cp è molto utile quando si esegue il debug di contenitori o si lavora in un ambiente di sviluppo. A volte è necessario iniettare manualmente un file di configurazione temporaneo o estrarre un registro nascosto. L'utilizzo di docker cp è più rapido e conveniente rispetto alla ricostruzione dell'intera immagine ogni volta che si apporta una modifica al codice.

Ricorda sempre che i file copiati nei contenitori rimarranno solo finché il contenitore è in vita. L'avvio di un altro contenitore dalla stessa immagine ti darà una lavagna pulita, senza i file che hai aggiunto con docker cp.

Riepilogo

docker cp ti consente di spostare i file tra il tuo host e i tuoi container Docker. Funziona con file e directory, ma manca della maggior parte delle funzionalità avanzate del comando cp basato sulla shell.

Pubblicità

L'uso regolare di docker cp indica un potenziale allontanamento dalle migliori pratiche del contenitore. È saggio trattarlo come uno strumento pratico per l'uso in fase di sviluppo, piuttosto che come parte integrante del lavoro con i contenitori. La persistenza dei file a lungo termine dovrebbe essere implementata con i volumi poiché questi sono componenti di prima classe nell'ecosistema Docker.