Me gustaría extraer un archivo de una imagen de Docker sin tener que ejecutar la imagen.
La docker saveopció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 saveopció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 createcomando 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 -dexcepto 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 catse 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.
layersizey json, y tampoco es legible por el usuario (incluso si el usuario está en el grupo acoplable). /var/lib/docker/aufs/diffcontendrá 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 saveno 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 savecomando con:
docker save IMAGE_NAME | tar -tvf -
3) Ajuste los layer.tararchivos en la salida de ese comando que coincidan con la fecha de la imagen que determinó en el paso 1. (puede agregar | grep layer.tarpara mostrar esos archivos)
4) Extraiga el layer.tararchivo 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.tararchivo 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.