Home
» LINUX
»
Come trasferire file da e verso un container Docker
Come trasferire file da e verso un container Docker
Utilizza il comando di Docker docker cpper copiare file o directory tra la tua macchina locale e un container. Funziona in entrambe le direzioni, copia le directory in modo ricorsivo e può essere utilizzato sia per container in esecuzione che arrestati. Non è necessario aprire una shell nel container né creare un archivio tar per una copia ordinaria.
La sintassi di base è docker cp SOURCE DESTINATION. Anteponi il nome o l'ID del container ai due punti per il percorso del container: docker cp LOCAL_PATH CONTAINER:CONTAINER_PATHcopia all'interno di un container, mentre docker cp CONTAINER:CONTAINER_PATH LOCAL_PATHcopia all'esterno. La documentazione di riferimento di Docker, `docker cp`, descrive le regole relative a percorsi e directory.
1. Trova il nome o l'ID del contenitore
Esegui questo comando da un terminale in cui i comandi Docker possano raggiungere il Docker Engine:
docker ps -a
docker psElenca i container in esecuzione; l'aggiunta -amostra anche i container arrestati. Utilizza il valore nella NAMEScolonna o un ID container nei comandi seguenti. Un nome come webè facile da riutilizzare; un ID è un identificatore preciso quando è necessario distinguere i container. Puoi controllare i campi mostrati da docker ps / docker container ls .
Utilizzare il nome o l'ID del contenitore mostrato da docker ps -a.
2. Copia un file dal tuo computer nel contenitore
Esegui docker cpil comando sulla macchina di cui desideri copiare i file. Ad esempio, da una cartella di progetto contenente report.csv, copiala in /tmpall'interno del contenitore denominato web:
docker cp ./report.csv web:/tmp/report.csv
Sostituisci ./report.csvcon il percorso del file locale, webcon il nome o l'ID del tuo container e /tmp/report.csvcon il percorso di destinazione all'interno del container. I percorsi dei container vengono interpretati a partire dalla directory radice del container, quindi la barra iniziale è facoltativa. Se la destinazione specifica una directory esistente, Docker inserisce il file al suo interno utilizzando il nome del file di origine.
Questo comando copia un file host nel container.
Docker copia le directory in modo ricorsivo. Se /etc/app/esistono già, questo comando le inserisce configal loro interno:
docker cp ./config web:/etc/app/
Per copiare solo il contenuto di configin /etc/app/, includi /.alla fine del percorso di origine:
Il /.suffisso indica di copiare il contenuto della directory, anziché annidare la directory di origine.
docker cp ./config/. web:/etc/app/
Docker non crea le directory padre mancanti. Crea prima la directory padre della destinazione. Per creare una cartella mancante all'interno di un container in esecuzione, esegui docker exec web mkdir -p /etc/app, quindi copia i file. docker execrichiede un container in esecuzione; docker cpno.
3. Copia un file dal contenitore al tuo computer
Per recuperare un file, inverti l'ordine di origine e destinazione. Crea prima la cartella di destinazione locale, quindi copia il file di log dal contenitore:
La cartella di destinazione locale deve esistere prima di copiare i file al suo interno.
È possibile recuperare una directory allo stesso modo. Aggiungi /.al percorso sorgente del contenitore per copiare il suo contenuto direttamente in una directory locale esistente:
docker cp web:/var/log/app/. ./backup/
Docker è in grado di copiare file da un container arrestato, il che è utile per raccogliere log o configurazioni dopo la terminazione di un processo.
Utilizzo di Docker Compose
Se il tuo progetto utilizza Compose, usa il nome del servizio docker compose cpinvece di cercare un ID del contenitore. Ad esempio, copia un file locale in un servizio denominato web:
Per impostazione predefinita, i file copiati in un container appartengono all'utente root e al gruppo primario; i file copiati sul computer appartengono all'utente che esegue Docker. Le autorizzazioni vengono mantenute ove possibile. Utilizzare questa opzione -aper preservare l'UID e il GID di origine. Se un'app non riesce a leggere un file, controlla la sua destinazione e la proprietà anziché concedere privilegi al container.
I file presenti nel livello scrivibile di un container vengono rimossi insieme al container stesso. Per i dati che devono persistere, utilizzare un volume Docker o un bind mount. I volumi sono adatti ai dati persistenti dei container; i bind mount consentono all'host e al container di accedere agli stessi file. Se si copiano file in un percorso coperto da un mount, si modificano i dati montati. Verificare prima la destinazione. Consultare la guida di Docker su volumi e bind mount .
Risoluzione rapida dei problemi
"Contenitore non trovato": esegui il comando docker ps -ae verifica il nome o l'ID del contenitore.
"File o directory non esistente": controlla il percorso di origine e assicurati che la directory padre di destinazione esista. I percorsi dei contenitori iniziano da /.
La cartella è stata posizionata un livello più in profondità del previsto: utilizzare il comando `sudo` /.per copiare solo il contenuto della directory.
Permesso negato: verifica che il tuo account possa utilizzare Docker e che l'utente dell'applicazione abbia i permessi di lettura o scrittura per la destinazione. Su Linux, utilizza questa opzione sudosolo se la policy di accesso a Docker del tuo sistema lo richiede.
I file scompaiono dopo la pulizia: salva i dati importanti in un volume o in un bind mount, non solo nello strato scrivibile del contenitore.