Montar o conteúdo do contêiner do Docker no sistema de arquivos host

24

Quero poder inspecionar o conteúdo de um contêiner do Docker (somente leitura). Uma maneira elegante de fazer isso seria montar o conteúdo do contêiner em um diretório. Estou falando de montar o conteúdo de um contêiner no host, não de montar uma pasta no host dentro de um contêiner.

Percebo que há dois drivers de armazenamento no Docker agora: aufs e btrfs. Minha própria instalação do Docker usa btrfs e a navegação em / var / lib / docker / btrfs / subvolumes mostra um diretório por contêiner do Docker no sistema. No entanto, este é um detalhe de implementação do Docker e parece errado montar - vincule esses diretórios em outro lugar.

Existe uma maneira adequada de fazer isso ou preciso corrigir o Docker para oferecer suporte a esses tipos de montagens?

dflemstr
fonte
Por que seria errado ligar montá-los em outro lugar?
Michael Hampton
1
Porque o local de armazenamento é um detalhe de implementação. A janela de encaixe dia adiciona outro driver de armazenamento, o local será movido. Preciso fazer isso semiautomático e seria bom usar APIs públicas por esse motivo.
Dflemstr
2
Pode valer a pena considerar trabalhar no nsenter (ou docker-enter) para atingir seus objetivos; é claro que existe a restrição de ter que inserir o código / ferramentas de inspeção dentro do contêiner.
precisa saber é o seguinte
Não há como instruir o Linux a montar através de uma borda de contêiner?
Dflemstr
@dflemstr sim, há, --volumes-de faz meio que, ao que parece para montar uma união do diretório de imagem base do outro recipiente e o volume, mas este comportamento não está documentado afaik
Tarnay Kálmán

Respostas:

10

Dê uma olhada docker export.

Para listar rapidamente os arquivos no seu contêiner:

docker export CONTAINER|tar -t

Exportar:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

Ou para olhar para um arquivo:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

O Docker 1.8 oferece suporte ao cp :

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

update: você deve fazer o ssh na sua máquina docker quando executar isso.

Laktak
fonte
2
Minhas imagens são razoavelmente grandes (muitas centenas de MiB), portanto, fazer isso para buscar arquivos individuais é muito caro. Ele criará o arquivo de centenas de megabytes todas as vezes.
Dflemstr 03/08/2015
O @dflemstr usa a linha com tar x PATH-IN-CONTAINER, ele extrairá apenas os arquivos que você precisa.
Laktak
... mas todo o tararquivo ainda é criado no daemon Docker, e leva vários minutos para criar ...
dflemstr
O @dflemstr não sabe ao certo qual é a sua configuração, mas docker export ubuntu|tar -t|grep etc/networkleva 3 segundos para mim.
Laktak
Você provavelmente está em execução que na mesma máquina que o daemon Docker para que você não precisa fazer uma transferência de rede, ea ubuntuimagem é realmente pequeno ...
dflemstr
3

Você pode usar o docker commit para manter o estado atual do seu contêiner em uma nova imagem e iniciar um contêiner interativo a partir dessa imagem para inspecionar o conteúdo.

A partir da documentação:

Pode ser útil confirmar as alterações ou configurações do arquivo de um contêiner em uma nova imagem. Isso permite depurar um contêiner executando um shell interativo ou exportar um conjunto de dados em funcionamento para outro servidor.

Espero que isto ajude.

Eric Citaire
fonte
2

Você pode usar o nsenter para executar seu programa de inspeção (que provavelmente já deve estar incluído no container) dentro de um container / namespace. Mas para montar o sistema de arquivos do contêiner como é visto dentro dele, você deve montar a imagem original e todas as camadas, se houver, ou a ação equivalente para o mapeador de dispositivos, btrfs e os outros mecanismos de armazenamento (futuros) usados, diferentes em cada caso. Provavelmente seria mais eficiente deixar o docker fazer o trabalho para você, exatamente como deveria, e usar o nsenter para fazer a inspeção dentro do contêiner.

Existem outras abordagens. O docker diff mostra quais arquivos foram alterados nesse contêiner, se você quiser ver o que foi alterado em vez do que estava na imagem original.

E para dados que devem ser persistentes e inspecionáveis, provavelmente um padrão melhor seria tê-lo em um volume no contêiner e montá-lo no sistema de arquivos real, ou em um contêiner de dados puro, ou no mesmo contêiner, mas que você pode iniciar outro contêiner com o programa de inspeção montando esses volumes a partir dele.

gmuslera
fonte
1

EDIT: Tentei a solução abaixo e, infelizmente, não funcionou bem para mim na prática. O sistema de arquivos montado não refletia com precisão o sistema de arquivos do contêiner (mesmo com cache=no). Não tenho certeza se este é um problema fundamental ou se estou fazendo algo errado.

Você pode instalar o sshd na imagem do docker e usá-lo docker execpara executar um serviço ssh ( /usr/sbin/sshd -D) no contêiner do docker (observe que a porta SSH 22 do contêiner do docker precisa ser exposta).

Em seguida, use docker cppara copiar sua chave pública ssh para o /root/.ssh/authorized_keysdiretório do contêiner do docker.

Por fim, use docker inspectpara encontrar o endereço IP do contêiner e montar o sistema de arquivos do contêiner usando

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  [email protected]:/ /mnt/my_container

Você teria que escrever um script para fazer isso funcionar confortavelmente na prática.

mnieber
fonte