Percebi com o docker que preciso entender o que está acontecendo dentro de um contêiner ou quais arquivos existem nele. Um exemplo é o download de imagens do índice da janela de encaixe - você não tem idéia do que a imagem contém, por isso é impossível iniciar o aplicativo.
O que seria ideal é ser capaz de ssh neles ou equivalente. Existe uma ferramenta para fazer isso ou minha conceituação de docker está errada ao pensar que eu deveria ser capaz de fazer isso.
linux
docker
filesystems
user2668128
fonte
fonte
docker exec <container> bash
. Então, você apenas abre uma concha dentro do contêiner.docker exec <container> ls <dir path>
edocker exec <container> cat <file path>
. Para o bash, no entanto, adicione as-it
opções.docker image save image_name > image.tar
como indicado na resposta do @ Gaurav24.Respostas:
ATUALIZAÇÃO
Método mais fácil: Usando o docker exec
O Docker versão 1.3 ou mais recente suporta o comando
exec
que se comporta de maneira semelhantensenter
. Este comando pode executar um novo processo no contêiner já em execução (o contêiner já deve ter o processo PID 1 em execução). Você pode executar/bin/bash
para explorar o estado do contêiner:consulte a documentação da linha de comandos do Docker
Método alternativo 1
Instantâneo
Você pode avaliar o sistema de arquivos do contêiner desta maneira:
Dessa forma, você pode avaliar o sistema de arquivos do contêiner em execução no momento preciso. O contêiner ainda está em execução, nenhuma alteração futura está incluída.
Mais tarde, você pode excluir o instantâneo usando (o sistema de arquivos do contêiner em execução não é afetado!):
Método alternativo 2
ssh
Se você precisar de acesso contínuo, poderá instalar o sshd no seu contêiner e executar o daemon sshd:
Dessa forma, você pode executar seu aplicativo usando ssh (conecte e execute o que quiser).
UPDATE: Método alternativo 3
nsenter
Use
nsenter
, consulte https://web.archive.org/web/20160305150559/http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/fonte
Option 1
.RUN apk update && apk add bash
(Tamanho: ~ 4MB)docker exec -t -i mycontainer /bin/sh
ATUALIZAÇÃO: EXPLORANDO!
Este comando deve permitir que você explore um contêiner de estivador em execução :
O equivalente para isso na janela de encaixe-composição seria:
(web é o nome do serviço nesse caso e tem tty por padrão.)
Quando estiver dentro, faça:
ou qualquer outro comando bash como:
Este comando deve permitir que você explore uma imagem da janela de encaixe :
uma vez dentro faça:
ou qualquer outro comando bash como:
A
-it
significa interativo ... e tty.Este comando deve permitir que você inspecione um contêiner ou imagem do docker em execução :
docker inspect name-of-container-or-image
Você pode fazer isso e descobrir se há algum
bash
oush
lá dentro. Procure o ponto de entrada ou cmd no retorno do json.Vejo documentação executável do docker
Vejo executor de doca-composição
consulte a janela de encaixe inspecionar a documentação
fonte
docker exec -ti <name> powershell
( fonte )docker exec -ti <name> cmd
funcionou. E para outros iniciantes como eu, certifique-se de usar o nome da instância do contêinerdocker ps
(algo como 070494393ca5) em vez do nome legível que você atribuiu a ele.Caso seu contêiner esteja parado ou não possua um shell (por exemplo,
hello-world
mencionado no guia de instalação ou nãoalpine
traefik
), este é provavelmente o único método possível de explorar o sistema de arquivos.Você pode arquivar o sistema de arquivos do seu contêiner no arquivo tar:
Ou liste os arquivos:
Observe que, dependendo da imagem, pode levar algum tempo e espaço em disco.
fonte
export
exemplo acima atingiu o ponto:docker export adoring_kowalevski | tar tf -
f -
no final do seu comando, o tar lê da entrada padrão por padrão. Simplesmentedocker export adoring_kowalevski | tar t
funciona.tar f
depende da configuração de alguém. Uma parte é aTAPE
variável de ambiente. Outros são controlados como parte da construção. O efeito líquido é que nunca se deve assumir que lê stdin ou escreve stdout, mas sempre declare explicitamente.O sistema de arquivos do contêiner está na pasta de dados da janela de encaixe, normalmente em / var / lib / docker. Para iniciar e inspecionar um sistema de arquivos de contêineres em execução, faça o seguinte:
E agora o diretório de trabalho atual é a raiz do contêiner.
fonte
Antes da criação do contêiner:
Se você explorar a estrutura da imagem montada dentro do contêiner, poderá fazer
Isso lhe daria a visibilidade de todas as camadas de uma imagem e sua configuração, presente nos arquivos json.
Após a criação do contêiner:
Para isso, já existem muitas respostas acima. minha maneira preferida de fazer isso seria -
fonte
A resposta mais votada está funcionando para mim quando o contêiner é realmente iniciado, mas quando não é possível executar e você, por exemplo, deseja copiar arquivos do contêiner, isso me salvou antes:
Graças ao docker cp ( link ), você pode copiar diretamente do contêiner, como qualquer outra parte do seu sistema de arquivos. Por exemplo, recuperando todos os arquivos dentro de um contêiner:
Observe que você não precisa especificar que deseja copiar recursivamente.
fonte
No Ubuntu 14.04, executando o Docker 1.3.1 , encontrei o sistema de arquivos raiz do contêiner na máquina host no seguinte diretório:
Informações completas da versão do Docker:
fonte
devicemapper
diretório). O arquivo existe em/var/lib/docker/overlay/<a sha256 apparently/<upper or merged>/...
. Não estou certo como portátil / seguro é acessar arquivos ládirect-lvm
por exemplo.Tente usar
Pode haver possibilidade de que o bash não seja implementado. para isso você pode usar
fonte
Eu uso outro truque sujo que é aufs / devicemapper agnóstico.
Eu olho para o comando que o contêiner está executando, por exemplo,
docker ps
e se é um apache oujava
eu apenas faço o seguinte:e voilá você está dentro do contêiner.
Basicamente, você pode colocar o CD raiz na
/proc/<PID>/root/
pasta, desde que esse processo seja executado pelo contêiner. Cuidado com links simbólicos não fará sentido usar esse modo.fonte
A resposta mais votada é boa, exceto se o seu contêiner não for um sistema Linux real.
Muitos contêineres (especialmente os baseados em go) não têm nenhum binário padrão (nenhum
/bin/bash
ou/bin/sh
). Nesse caso, você precisará acessar o arquivo de contêineres diretamente:Funciona como um encanto:
Nota: Você precisa executá-lo como root.
fonte
No meu caso, nenhum shell era suportado no contêiner, exceto
sh
. Então, isso funcionou como um encantofonte
você pode usar o mergulho para visualizar o conteúdo da imagem interativamente com a TUI
https://github.com/wagoodman/dive
fonte
Isso iniciará uma sessão do bash para a imagem:
docker run --rm -it --entrypoint = / bin / bash
fonte
Para mim, este funciona bem (graças aos últimos comentários por apontar o diretório / var / lib / docker / ):
Aqui, 2465790aa2c4 é o ID curto do contêiner em execução (conforme exibido pelo docker ps ), seguido por uma estrela.
fonte
Nas versões mais recentes do Docker, você pode executar
docker exec [container_name]
um shell dentro do contêinerEntão, para obter uma lista de todos os arquivos em um contêiner, execute
docker exec [container_name] ls
fonte
Para o docker aufs driver:
O script encontrará o diretório raiz do contêiner (Teste no docker 1.7.1 e 1.10.3)
fonte
Nenhuma das respostas existentes trata do caso de um contêiner que saiu (e não pode ser reiniciado) e / ou não possui nenhum shell instalado (por exemplo, sem distração). Este funciona desde que você tenha acesso root ao host do Docker.
Para uma inspeção manual real, descubra primeiro os IDs da camada:
Na saída, você verá algo como
Navegue até esta pasta (como root) para encontrar o estado visível atual do sistema de arquivos do contêiner.
fonte
Esta resposta ajudará aqueles (como eu) que desejam explorar o sistema de arquivos de volume do docker, mesmo que o contêiner não esteja em execução.
Lista de contêineres de docker em execução:
docker ps
=> ID DO RECIPIENTE "4c721f1985bd"
Observe os pontos de montagem do volume da janela de encaixe na sua máquina física local ( https://docs.docker.com/engine/tutorials/dockervolumes/ ):
docker inspect -f {{.Mounts}} 4c721f1985bd
=> [{/ tmp / container-garren / tmp true rprivate}]
Isso indica que o diretório da máquina física local / tmp / container-garren é mapeado para o destino do volume da janela de encaixe / tmp.
Conhecer o diretório da máquina física local (/ tmp / container-garren) significa que eu posso explorar o sistema de arquivos se o contêiner do docker está ou não em execução. Isso foi fundamental para me ajudar a descobrir que havia alguns dados residuais que não deveriam ter persistido mesmo depois que o contêiner não estava em execução.
fonte
outro truque é usar a ferramenta atômica para fazer algo como:
A imagem do Docker será montada em / path / to / mnt para você inspecioná-la.
fonte
Somente para LINUX
A maneira mais simples de usar usando proc dir, que é o contêiner, deve estar em execução para inspecionar os arquivos do contêiner do docker.
Descubra a identificação do processo (PID) do contêiner e armazene em alguma variável
Verifique se o processo do contêiner está em execução e use a variável nameto para entrar na pasta do contêiner
Se você deseja passar pelo diretório sem descobrir o número PID, basta usar este comando longo
Dicas:
Depois de entrar no contêiner, tudo o que você fizer afetará o processo real do contêiner, como interromper o serviço ou alterar o número da porta.
Espero que ajude
Nota:
Esse método funciona apenas se o contêiner ainda estiver em execução, caso contrário, o diretório não existiria mais se o contêiner tivesse parado ou removido
fonte
Minha maneira preferida de entender o que está acontecendo dentro do contêiner é:
expor -p 8000
Iniciar servidor dentro dele
fonte
Para um contêiner já em execução, você pode:
Você precisa ser root para entrar nesse diretório. Se você não é root, tente 'sudo su' antes de executar o comando.
Edit: Após a v1.3, veja a resposta de Jiri - é melhor.
fonte
Se você estiver usando o Docker v19.03, siga as etapas abaixo.
fonte
Se você estiver usando o driver de armazenamento AUFS, poderá usar o script da camada de encaixe para encontrar a camada de raiz do sistema de arquivos (mnt) e a leitura e gravação de qualquer contêiner:
Edit 2018-03-28:
docker-layer foi substituído por docker-backup
fonte
O
docker exec
comando para executar um comando em um contêiner em execução pode ajudar em vários casos.Por exemplo :
1) Acessando no bash o sistema de arquivos do contêiner em execução:
2) Acessando no bash o sistema de arquivos do contêiner em execução como root para poder ter os direitos necessários:
Isso é particularmente útil para poder fazer algum processamento como raiz em um contêiner.
3) Acesso no bash ao sistema de arquivos do contêiner em execução com um diretório de trabalho específico:
fonte
Você pode executar um bash dentro do contêiner com este:
$ docker run -it ubuntu /bin/bash
fonte