Estou tentando criar uma nova imagem do Docker para o nosso processo de desenvolvimento, usando cpanm
para instalar um monte de módulos Perl como uma imagem base para vários projetos.
Ao desenvolver o Dockerfile, cpanm
retorna um código de falha porque alguns dos módulos não foram instalados corretamente.
Tenho certeza de que preciso apt
instalar mais algumas coisas.
Minha pergunta é: onde posso encontrar o /.cpanm/work
diretório citado na saída para inspecionar os logs? No caso geral, como posso inspecionar o sistema de arquivos de um docker build
comando com falha ?
Manhã editar Depois de morder a bala e executar um find
eu descobri
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
Isso é confiável ou é melhor criar um contêiner "vazio" e executar as coisas manualmente até ter todas as coisas de que preciso?
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
aqueles que são internos do Docker e eu não iria mexer com elesRespostas:
Sempre que o docker executa com êxito um
RUN
comando de um Dockerfile, uma nova camada no sistema de arquivos de imagem é confirmada. Convenientemente, você pode usar esses IDs de camadas como imagens para iniciar um novo contêiner.Tome o seguinte Dockerfile:
e construa-o:
Agora você pode começar um novo recipiente de
00f017a8c2a6
,044e1532c690
e5bd8172529c1
:é claro que você pode querer iniciar um shell para explorar o sistema de arquivos e experimentar os comandos:
Quando um dos comandos do Dockerfile falha, o que você precisa fazer é procurar o ID da camada anterior e executar um shell em um contêiner criado a partir desse ID:
Uma vez no recipiente:
Se você realmente precisa experimentar a camada real que falhou em vez de trabalhar a partir da última camada de trabalho, consulte a resposta de Drew .
fonte
docker run --rm -it <id_last_working_layer> bash -il
e uma vez no contêiner, tente o comando que falhou em reproduzir o problema e, em seguida, corrija o comando e teste-o, finalmente atualize seu Dockerfile com o comando corrigido.docker diff <container>
obter e obter uma lista completa das alterações específicas do sistema de arquivos feitas nessa camada específica (arquivos adicionados, excluídos ou alterados em todo o sistema de arquivos da imagem).Unable to find image 'd5219f1ffda9:latest' locally
. No entanto, fiquei confuso com os vários tipos de IDs. Acontece que você precisa usar os IDs que estão diretamente após as setas, não os que dizem "Executando em ...".A resposta superior funciona no caso em que você deseja examinar o estado imediatamente antes do comando com falha.
No entanto, a pergunta pergunta como examinar o estado do contêiner que falhou. Na minha situação, o comando com falha é uma compilação que leva várias horas; portanto, retroceder antes do comando com falha e executá-lo novamente leva muito tempo e não é muito útil.
A solução aqui é encontrar o contêiner que falhou:
Confirme com uma imagem:
E, em seguida, execute a imagem [se necessário, executando o bash]:
Agora você está realmente olhando o estado da construção no momento em que ela falhou, em vez de antes de executar o comando que causou a falha.
fonte
DOCKER_BUILDKIT=1
para criar o seuDockerfile
O Docker armazena em cache todo o estado do sistema de arquivos após cada
RUN
linha bem-sucedida .Sabendo que:
RUN
de comando, comentá-la na Dockerfile (bem como todas e quaisquer subseqüentesRUN
comandos), em seguida, executardocker build
edocker run
novamente.RUN
comando com falha , basta adicionar|| true
a ele para forçá-lo a ter sucesso; então proceda como acima (mantenha todo e qualquerRUN
comando subsequente comentado, executedocker build
edocker run
)Não há necessidade de mexer com os IDs de camada ou internos do Docker e, como bônus, o Docker minimiza automaticamente a quantidade de trabalho que precisa ser refeito.
fonte
Depurar falhas na etapa de construção é realmente muito irritante.
A melhor solução que encontrei é garantir que cada etapa que faz um trabalho real seja bem-sucedida e adicione uma verificação após as que falharem. Dessa forma, você obtém uma camada confirmada que contém as saídas da etapa com falha que você pode inspecionar.
Um Dockerfile, com um exemplo após a
# Run DB2 silent installer
linha:fonte
O que eu faria é comentar o Dockerfile abaixo e incluir a linha incorreta. Em seguida, você pode executar o contêiner e executar os comandos da janela de encaixe manualmente e ver os logs da maneira usual. Por exemplo, se o Dockerfile for
e está morrendo no bar eu faria
Então
fonte