Como ver o conteúdo da imagem do Docker

291

Fiz um puxador do docker e posso listar a imagem baixada. Eu quero ver o conteúdo desta imagem. Fiz uma pesquisa na net, mas nenhuma resposta direta.

aprender
fonte
10
Não é um idiota. Visualizar o contêiner e a imagem não é a mesma coisa. Convém exibir o sistema de arquivos inicial ou até validar que não há nada malicioso na imagem antes que ela seja executada.
Keilaron
4
se não foi possível executar a imagem como contêiner, você pode usar uma ferramenta como drive ( github.com/wagoodman/dive ) ou o docker save para exportar a imagem como arquivo tar. Depois, você pode explorar o alcatrão ou, com o mergulho, pode explorar o mais rápido possível a imagem.
FunThomas424242 13/03/19
Não um joguete, mas você pode encontrar a resposta aqui: stackoverflow.com/a/40324326/5641227
Khalil Gharbaoul

Respostas:

372

Você pode simplesmente executar um contêiner de shell interativo usando essa imagem e explorar qualquer conteúdo que a imagem tenha.

Por exemplo:

docker run -it image_name sh

Ou seguindo para imagens com um entrypoint

docker run -it --entrypoint sh image_name

Ou, se você quiser ver como a imagem foi criada, ou seja, as etapas Dockerfile, é possível:

docker image history --no-trunc image_name > image_history

As etapas serão registradas no image_historyarquivo.

Ayman Nedjmeddine
fonte
1
Obrigado. O primeiro é o que estou procurando. Explore basicamente as pastas.
pylearn
9
Estou tentando ver o conteúdo de uma imagem criada usando "FROM scratch" e não há shell disponível. Existe alguma outra maneira de ver o conteúdo? A imagem que estou tentando ver é portainer / portainer.
Juan Hernandez
2
É possível que alguém veja o conteúdo da imagem sem gerar um contêiner? Ou podemos assumir que é seguro para todos, a menos que eles tenham direitos de gerar um contêiner a partir dele?
Shabirmean
3
combinar o que foi dito anteriormente "para um contêiner do Windows com ponto de entrada": docker run -it --entrypoint cmd <image_name>funcionará.
precisa saber é o seguinte
2
@JuanHernandez, sim, você pode despejar todo o conteúdo da imagem, conforme indicado em stackoverflow.com/a/42677219/320594 .
Jaime Hablutzel
197

A resposta aceita aqui é problemática, porque não há garantia de que uma imagem tenha qualquer tipo de shell interativo. Por exemplo, o zumbido / zumbido imagem contém em um único comando /drone, e ele tem um ENTRYPOINTbem, de modo que este irá falhar:

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

E isso irá falhar:

$ docker run --rm -it --entrypoint sh drone/drone
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sh\": executable file not found in $PATH".

Esta não é uma configuração incomum; muitas imagens mínimas contêm apenas os binários necessários para dar suporte ao serviço de destino. Felizmente, existem mecanismos para explorar um sistema de arquivos de imagem que não dependem do conteúdo da imagem. O mais fácil é provavelmente o docker exportcomando, que exportará um sistema de arquivos contêiner como um arquivo tar. Portanto, inicie um contêiner (não importa se falha ou não):

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

Em seguida, use docker exportpara exportar o sistema de arquivos para tar:

$ docker export $(docker ps -lq) | tar tf -

O docker ps -lqsignifica "me dê o ID do contêiner do docker mais recente". Você pode substituir isso por um nome ou ID explícito de contêiner.

larsks
fonte
5
esta resposta é super útil para a figura que poderia ser dentro de um recipiente em um determinado momento
João Andrade
2
Esta resposta é mais correto e trabalha para mim, pois eu quero explorar conteúdo da imagem com a arquitetura externa e não posso "basta executar" ele
Vladimir Perevalov
94

Você não deve iniciar um contêiner apenas para ver o conteúdo da imagem. Por exemplo, você pode procurar conteúdo malicioso, não executá-lo. Use "create" em vez de "run";

docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$
lgekman
fonte
11
A segunda linha acima apenas lista o conteúdo do sistema de arquivos. Se você deseja obter todos os arquivos como um alcatrão, pode substituí-lo por algo como docker export tmp_$$ > image-fs.tar.
Pino
Qual será a segunda linha do sistema operacional Windows? O docker export tmp_$$ | tar tnão vai funcionar.
Alexei Marinichenko 29/08/19
@Alexei Marinichenko tarpode não estar instalado em sua máquina. Tente tar --helpverificar isso.
Abdurrahman I.
1
Isso também funciona se não houver concha no contêiner #
612 Peter Dotchev
3
@AlexeiMarinichenko, você pode usar o -oparâmetro para especificar o arquivo no qual gravar. Por exemplo docker export -o c:\temp\tmp_$$.tar tmp_$$.
GiddyUpHorsey
62
docker save nginx > nginx.tar
tar -xvf nginx.tar

Os seguintes arquivos estão presentes:

  • manifest.json - Descreve as camadas do sistema de arquivos e o nome do arquivo json que possui as propriedades Container.
  • .json - propriedades do contêiner
  • - Cada diretório "layerid" contém um arquivo json que descreve a propriedade e o sistema de arquivos da camada associados a essa camada. O Docker armazena imagens de contêiner como camadas para otimizar o espaço de armazenamento reutilizando camadas nas imagens.

https://sreeninet.wordpress.com/2016/06/11/looking-inside-container-images/

OU

você pode usar o mergulho para visualizar o conteúdo da imagem interativamente com a TUI

insira a descrição da imagem aqui

https://github.com/wagoodman/dive

Andy Wong
fonte
5
Essa parece ser a resposta mais útil para mim, pois você não precisa iniciar um contêiner para obter os arquivos.
Alec Thomas
1
Concordo absolutamente com o @AlecThomas - e, para dar um passo adiante, por que eu preciso dockerapenas ver o conteúdo do que é, essencialmente, apenas um tipo diferente de arquivo morto?
Ed Randall
boa resposta, também gostaria de especificar o tag: docker save --output nginx.tar nginx:latest, caso contrário, de acordo com o documento, ele irá conter "todas as camadas pai, e todas as etiquetas + versões"
Tarek
Isso deve ser votado, pois provavelmente é a única maneira de explorar os internos, se você não tiver nenhum utilitário do Unix. Além disso, esse caminho não requer a criação de um contêiner.
Stanislav German-Evtushenko
9

Para listar o conteúdo detalhado de uma imagem, é necessário executar o docker run --rm image/name ls -alRlocal em que --rmsignifica remover assim que sair do formulário.

insira a descrição da imagem aqui

Serge Voloshenko
fonte
11
Isso pressupõe que a imagem tem lsdisponível e naPATH
chaosaffe
6

EXPLORANDO A IMAGEM DO DOCKER !

  1. Descobrir que tipo de concha é lá bashou shou ...

    Inspecione a imagem primeiro: docker inspect name-of-container-or-image

    Procure entrypointou cmdno retorno de json.

  2. Então faça: docker run --rm -it --entrypoint=/bin/bash name-of-image

    uma vez dentro do: ls -lsaou qualquer outro comando do shell como:cd ..

    A -itsignifica interativo ... e tty. os --rmsuportes para remover o recipiente após a execução.

Khalil Gharbaoui
fonte
1
O problema com esta resposta é que, conforme discutido na resposta aceita, não há garantia de que sua imagem tenha qualquer shell nela. Or ls. Ou realmente qualquer ferramenta comum.
larsks 07/01
4

Podemos tentar um mais simples da seguinte maneira:

docker image inspect image_id

Isso funcionou na versão Docker:

DockerVersion": "18.05.0-ce"
Subham Chowdhury
fonte
12
Isso não mostra o conteúdo ; mostra apenas as camadas etc. que foram usadas na construção da imagem.
Roger Lipscombe
0

Com o Docker EE para Windows (17.06.2-ee-6 no Hyper-V Server 2016), todo o conteúdo dos Windows Containers pode ser examinado no C:\ProgramData\docker\windowsfilter\caminho do sistema operacional host.

Não é necessária montagem especial.

O prefixo da pasta pode ser encontrado pelo ID do contêiner da docker ps -asaída.

Vadzim
fonte
-1

Existe uma ferramenta gratuita de código aberto chamada Anchore que você pode usar para digitalizar imagens de contêineres. Este comando permitirá listar todos os arquivos em uma imagem de contêiner

conteúdo da imagem anchore-cli myrepo / app: arquivos mais recentes

https://anchore.com/opensource/

user11845290
fonte