Gostaria de extrair um arquivo de uma imagem do Docker sem precisar executá-la.
A docker save
opção não é atualmente uma opção viável para mim, pois está salvando um arquivo muito grande apenas para desmarcar um arquivo específico.
Gostaria de extrair um arquivo de uma imagem do Docker sem precisar executá-la.
A docker save
opção não é atualmente uma opção viável para mim, pois está salvando um arquivo muito grande apenas para desmarcar um arquivo específico.
Respostas:
Você pode extrair arquivos de uma imagem com os seguintes comandos:
docker create $image # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id
De acordo com a docker create
documentação , isso não executa o contêiner:
O
docker create
comando cria uma camada de contêiner gravável sobre a imagem especificada e a prepara para executar o comando especificado. O ID do contêiner é impresso paraSTDOUT
. É semelhante a,docker run -d
exceto que o contêiner nunca é iniciado. Você pode usar odocker start <container_id>
comando para iniciar o contêiner a qualquer momento.
Para referência (minha resposta anterior), uma maneira menos eficiente de extrair um arquivo de uma imagem é a seguinte:
docker run some_image cat $file_path > $output_path
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
Nenhuma das opções acima funcionou para mim. O comando de trabalho completo é:
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
Sem aspas cat
é passado sem nome do arquivo, portanto, ele não sabe o que mostrar. Também é uma boa idéia excluir o contêiner após a conclusão do comando.
Se não me engano, acredito que os contêineres do docker armazenam arquivos em cache criados no seguinte diretório do Ubuntu:
/var/lib/docker/aufs/diff/<container_id>
A partir daí, você poderá acessar o sistema de arquivos e recuperar seus arquivos.
layersize
e json
, e também não é legível pelo usuário (mesmo se o usuário estiver no grupo de janelas de encaixe). /var/lib/docker/aufs/diff
conterá o arquivo que eu procuro (mas não é categorizado pelo ID do contêiner) e também não é legível.
/var/lib/docker/aufs
(mas não todos os outros diretórios em /var/lib/docker/
)
Se armazenar a saída completa de docker save
não for uma opção, você poderá usar pipelines para extrair apenas o arquivo necessário.
Infelizmente, como a saída é um "alcatrão de alcatrão", pode ser um processo ligeiramente iterativo.
O que fiz quando precisei extrair um arquivo agora foi:
1) Determine em qual versão da imagem o arquivo em que você está interessado mudou mais recentemente (como você faz isso provavelmente depende da sua imagem) e a data em que foi criada / salva
2) Obtenha o índice completo da saída do docker save
comando com:
docker save IMAGE_NAME | tar -tvf -
3) Ajuste os layer.tar
arquivos na saída desse comando que correspondem à data da imagem que você determinou na etapa 1. (você pode adicionar | grep layer.tar
para mostrar apenas esses arquivos)
4) Extraia esse layer.tar
arquivo para o padrão e obtenha o sumário:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -tvf -
5) Verifique se o arquivo que você deseja está listado e extraia-o quando encontrar o nome:
docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE
Se houver mais de um layer.tar
arquivo correspondente à data que você está procurando na etapa 2/3, talvez seja necessário repetir a etapa 4 para cada um deles até encontrar o caminho certo.
Substitua o texto em maiúsculas nos comandos acima pelos nomes de imagem, somas de verificação e nomes de arquivos corretos para o seu caso.