Tentando corrigir erros e depurar problemas com meu aplicativo dividido em vários contêineres, frequentemente edito arquivos em contêineres:
ou sou totalmente preguiçoso e instalo o nano e edito diretamente no container ou
Eu encaixo e retiro o arquivo do contêiner, edito, copio de volta e reinicio o contêiner
Essas são etapas intermediárias antes de chegar a um novo conteúdo para a construção de contêiner, o que leva muito mais tempo do que fazer o acima (o que, obviamente, é apenas intermediário / fiddling).
Agora, frequentemente, interrompo o programa inicial do contêiner, que nos casos de quebra é um script de nó ou um script de servidor da web python, ambos normalmente falham devido a erros de sintaxe.
Existe alguma maneira de salvar esses contêineres? Como eles não iniciam, não posso encaixar o exec neles e, portanto, eles estão perdidos para mim. Em seguida, sigo a rota rm / rmi / build / run depois de corrigir o arquivo incorreto na entrada de compilação.
Como posso editar arquivos em um contêiner interrompido, copiá-los ou iniciar um shell em um contêiner interrompido - qualquer coisa que me permita consertar esse contêiner?
(Parece um pouco como trabalhar em um computador remoto e interromper a configuração de rede - a conexão é perdida "para sempre" dessa forma e é necessário usar um fallback, se houver.)
Como editar arquivos de contêiner Docker do host? parece relevante, mas está desatualizado.
docker cp
os arquivos no contêiner (ou criar uma nova imagem)docker commit
comando para quebrar uma nova imagem.name=$(docker commit); docker run -it $name /bin/sh
vai fazer o que você quiser.Respostas:
Tive um problema com um contêiner que não inicializava devido a uma alteração incorreta na configuração. Consegui copiar o arquivo do contêiner interrompido e editá-lo. algo como:
(corrija o arquivo)
fonte
UpperDir
você obter dedocker container inspect
- você terá que experimentar para ver como o sistema de sobreposição representa os arquivos na estrutura subjacente que foram excluídos na camada superior.Respondendo minha própria pergunta .. ainda esperando por uma resposta melhor de uma pessoa mais qualificada !!
Existem 2 possibilidades.
1) Editando o sistema de arquivos diretamente no host . Isso é um tanto perigoso e pode quebrar completamente o contêiner, possivelmente outros dados, dependendo do que estiver errado.
2) Alterar o script de inicialização para algo que nunca falha como iniciar um bash, fazer as correções / edições e, em seguida, alterar o programa de inicialização novamente para o desejado (como um nó ou o que quer que fosse antes).
Mais detalhes:
1) Usando
para encontrar os contêineres em execução ou
para encontrar todos os contêineres (incluindo aqueles parados) e
procure o "Id", um dos primeiros valores.
Esta é a parte que contém detalhes de implementação e pode mudar, esteja ciente de que você pode perder seu contêiner dessa forma.
Vamos para
e lá você encontrará todos os arquivos que foram alterados em relação à imagem na qual o contêiner se baseia. Você pode substituir arquivos, adicionar ou editar arquivos.
Novamente, eu não recomendaria isso.
2) Conforme descrito em https://stackoverflow.com/a/32353134/586754, você pode encontrar a configuração json config.json em um caminho como
Lá você pode alterar os argumentos de, por exemplo, "nodejs app.js" para "/ bin / bash". Agora reinicie o serviço docker e inicie o contêiner (você verá que agora ele inicializa corretamente). Você deveria usar
para ter certeza de que não pare imediatamente. Agora você pode trabalhar com o contêiner e / ou posteriormente anexar com
docker exec -ti (containername) /bin/bash
Além disso, docker cp é bastante útil para copiar arquivos que foram editados fora do contêiner.
Além disso, só se deve voltar a essas medidas se o contêiner estiver mais ou menos "perdido" de qualquer maneira, então qualquer mudança seria uma melhoria.
fonte
config.json
arquivos sempre que os editeiVocê pode editar o sistema de arquivos do container diretamente, mas não sei se é uma boa ideia. Primeiro você precisa encontrar o caminho do diretório que é usado como raiz do tempo de execução para o contêiner. Corra
docker container inspect id/name
. Procure a chaveUpperDir
na saída JSON.Esse é o seu diretório.
fonte
Se você está tentando reiniciar um contêiner interrompido e precisa alterar o contêiner devido à configuração incorreta, mas o contêiner não está iniciando, você pode fazer o seguinte, o que funciona usando o comando "docker cp" (semelhante à sugestão anterior). Este procedimento permite remover arquivos e fazer quaisquer outras alterações necessárias. Com sorte, você pode pular muitas das etapas abaixo.
Modifique ou crie um novo script de ponto de entrada, por exemplo
#!/bin/bash tail -f /etc/hosts
fonte