Me gustaría extraer un archivo de una imagen de Docker sin tener que ejecutar la imagen.
La docker save
opción no es actualmente una opción viable para mí, ya que está guardando un archivo demasiado grande solo para liberar un archivo específico.
Me gustaría extraer un archivo de una imagen de Docker sin tener que ejecutar la imagen.
La docker save
opción no es actualmente una opción viable para mí, ya que está guardando un archivo demasiado grande solo para liberar un archivo específico.
Respuestas:
Puede extraer archivos de una imagen con los siguientes comandos:
docker create $image # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id
Según la docker create
documentación , esto no ejecuta el contenedor:
El
docker create
comando crea una capa de contenedor grabable sobre la imagen especificada y la prepara para ejecutar el comando especificado. La identificación del contenedor se imprime enSTDOUT
. Esto es similar adocker run -d
excepto que el contenedor nunca se inicia. Luego puede usar eldocker start <container_id>
comando para iniciar el contenedor en cualquier momento.
Como referencia (mi respuesta anterior), una forma menos eficiente de extraer un archivo de una imagen es la siguiente:
docker run some_image cat $file_path > $output_path
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
Nada de lo anterior funcionó para mí. El comando de trabajo completo es:
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
Sin comillas cat
se pasa sin nombre de archivo, por lo que no sabe qué mostrar. También es una buena idea eliminar el contenedor una vez finalizado el comando.
Si no me equivoco, creo que los contenedores docker almacenan archivos en caché creados en el siguiente directorio para Ubuntu:
/var/lib/docker/aufs/diff/<container_id>
Desde allí, debería poder acceder al sistema de archivos y recuperar sus archivos.
layersize
y json
, y tampoco es legible por el usuario (incluso si el usuario está en el grupo acoplable). /var/lib/docker/aufs/diff
contendrá el archivo que busco (pero no está clasificado por la identificación del contenedor) y tampoco es legible.
/var/lib/docker/aufs
(pero no todos los demás directorios /var/lib/docker/
)
Si almacenar la salida completa de docker save
no es una opción, puede usar tuberías para extraer solo el archivo necesario.
Desafortunadamente, debido a que el resultado es un "alquitrán de alquitranes", puede ser un proceso ligeramente iterativo.
Lo que hice cuando necesitaba extraer un archivo en este momento fue:
1) Determine qué versión de la imagen cambió el archivo que le interesa más recientemente (cómo lo hace probablemente depende de su imagen) y la fecha en que se creó / guardó
2) Obtenga la tabla de contenido completa de la salida del docker save
comando con:
docker save IMAGE_NAME | tar -tvf -
3) Ajuste los layer.tar
archivos en la salida de ese comando que coincidan con la fecha de la imagen que determinó en el paso 1. (puede agregar | grep layer.tar
para mostrar esos archivos)
4) Extraiga el layer.tar
archivo al estándar y obtenga la tabla de contenido:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -
5) Verifique que el archivo que desea esté en la lista y extráigalo una vez que encuentre el nombre:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE
Si hay más de un layer.tar
archivo que coincida con la fecha que busca en el paso 2/3, es posible que deba repetir el paso 4 para cada uno de ellos hasta encontrar el correcto
Reemplace el texto en mayúsculas en los comandos anteriores con los nombres de imagen, sumas de verificación y nombres de archivo correctos para su caso.