Mi piacerebbe estrarre un file da un'immagine Docker senza dover eseguire l'immagine.
L' docker save
opzione non è attualmente un'opzione valida per me in quanto sta salvando un file troppo grande solo per decomprimere un file specifico.
Mi piacerebbe estrarre un file da un'immagine Docker senza dover eseguire l'immagine.
L' docker save
opzione non è attualmente un'opzione valida per me in quanto sta salvando un file troppo grande solo per decomprimere un file specifico.
Risposte:
Puoi estrarre file da un'immagine con i seguenti comandi:
docker create $image # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id
Secondo la docker create
documentazione , questo non esegue il contenitore:
Il
docker create
comando crea un livello contenitore scrivibile sull'immagine specificata e lo prepara per l'esecuzione del comando specificato. L'ID contenitore viene quindi stampato suSTDOUT
. Questo è simile addocker run -d
eccezione del fatto che il contenitore non viene mai avviato. È quindi possibile utilizzare ildocker start <container_id>
comando per avviare il contenitore in qualsiasi momento.
Per riferimento (la mia risposta precedente), un modo meno efficiente di estrarre un file da un'immagine è il seguente:
docker run some_image cat $file_path > $output_path
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
Nessuna delle precedenti ha funzionato per me. Il comando di lavoro completo è:
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
Senza virgolette cat
viene passato senza nome file, quindi non sa cosa mostrare. Inoltre è una buona idea eliminare il contenitore al termine del comando.
Se non sbaglio, credo che i contenitori docker memorizzino i file memorizzati nella cache creati nella seguente directory per Ubuntu:
/var/lib/docker/aufs/diff/<container_id>
Da lì dovresti essere in grado di accedere al file system e recuperare i tuoi file.
layersize
e json
, inoltre, non è leggibile dall'utente (anche se l'utente si trova nel gruppo finestra mobile). /var/lib/docker/aufs/diff
conterrà il file che cerco (ma non è classificato in base all'ID contenitore) e inoltre non è leggibile.
/var/lib/docker/aufs
(ma non tutte le altre directory in /var/lib/docker/
)
Se la memorizzazione dell'output completo di docker save
non è un'opzione, è possibile utilizzare le pipeline per estrarre solo il file necessario da esso.
Sfortunatamente, poiché l'output è un "catrame di tar", può essere un processo leggermente iterativo.
Quello che ho fatto quando avevo bisogno di estrarre un file proprio ora era:
1) Determina quale versione dell'immagine il file che ti interessa è cambiato più di recente (il modo in cui lo fai dipende probabilmente dalla tua immagine) e la data in cui è stato creato / salvato
2) Ottieni il sommario completo dall'output del docker save
comando con:
docker save IMAGE_NAME | tar -tvf -
3) Fine i layer.tar
file nell'output di quel comando che corrispondono alla data dell'immagine che hai determinato nel passaggio 1. (puoi aggiungere | grep layer.tar
per mostrare solo quei file)
4) Estrai quel layer.tar
file in standard e ottieni il sommario di esso:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -
5) Verificare che il file desiderato sia elencato ed estrarlo una volta trovato il nome:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE
Se sono presenti più layer.tar
file corrispondenti alla data che stai cercando nel passaggio 2/3, potrebbe essere necessario ripetere il passaggio 4 per ognuno di essi fino a trovare quello giusto
Sostituisci il testo in maiuscolo nei comandi sopra con i nomi delle immagini, i checksum e i nomi dei file corretti per il tuo caso.