Gostaria de iniciar um contêiner do Docker parado com um comando diferente, pois o comando padrão falha - o que significa que não posso iniciar o contêiner e depois usar 'docker exec'.
Basicamente, gostaria de iniciar um shell para poder inspecionar o conteúdo do contêiner.
Felizmente, criei o contêiner com a opção -it!
inspect
saída em uma configuração usada na execução subsequente?Edite este arquivo (correspondente ao seu contêiner parado):
Mude o parâmetro "Path" para apontar para o seu novo comando, por exemplo, / bin / bash. Você também pode definir o parâmetro "Args" para passar argumentos para o comando.
Reinicie o serviço docker (observe que isso interromperá todos os contêineres em execução):
Liste seus contêineres e verifique se o comando foi alterado:
Inicie o contêiner e prenda-o, agora você deve estar em sua concha!
Trabalhou no Fedora 22 usando o Docker 1.7.1.
NOTA: Se o seu shell não for interativo (por exemplo, você não criou o contêiner original com a opção -it), você pode alterar o comando para "/ bin / sleep 600" ou "/ bin / tail -f / dev / null" para lhe dar tempo suficiente para executar o "docker exec -it CONTID / bin / bash" como outra maneira de obter um shell.
NOTA2: As versões mais recentes do docker têm o config.v2.json, onde você precisará alterar o Ponto de entrada ou o Cmd (obrigado user60561).
fonte
..."Path":"tail","Args":["-f","/dev/null"]...
config.v2.json
, onde você precisará alterar umEntrypoint
ou outroCmd
.Adicione uma verificação ao topo do seu script do Ponto de Entrada
O Docker realmente precisa implementar isso como um novo recurso, mas aqui está outra opção de solução alternativa para situações nas quais você tem um Ponto de Entrada que termina após sucesso ou falha, o que pode dificultar a depuração.
Se você ainda não possui um script de Ponto de Entrada, crie um que execute os comandos necessários para o seu contêiner. Em seguida, na parte superior deste arquivo, adicione estas linhas a
entrypoint.sh
:Para garantir que
cat
a conexão seja mantida, você pode precisar fornecer um TTY. Estou executando o contêiner com meu script Entrypoint da seguinte forma:Isso fará com que o script seja executado uma vez, criando um arquivo que indica que ele já foi executado (no sistema de arquivos virtual do contêiner). Você pode reiniciar o contêiner para executar a depuração:
Quando você reinicia o contêiner, o
already_ran
arquivo será encontrado, fazendo com que o script do Ponto de Entrada seja interrompidocat
(o que apenas espera eternamente pela entrada que nunca chegará, mas mantém o contêiner ativo). Você pode executar umabash
sessão de depuração :Enquanto o contêiner estiver em execução, você também poderá remover
already_ran
e executar manualmente oentrypoint.sh
script para executá -lo novamente, se precisar depurar dessa maneira.fonte
/bin/sh
vez decat
- então você sempre pode entrar apenas reiniciando. Sua solução é demais!Meu problema:
docker run <IMAGE_NAME>
docker ps -a
, pude ver dois contêineres.docker run <IMAGE_NAME>
comando, uma nova imagem era criadaSolução: Para trabalhar no mesmo contêiner criado em primeiro lugar, execute estas etapas
docker ps
para obter contêiner do seu contêinerdocker container start <CONTAINER_ID>
para iniciar o contêiner existentedocker exec -it <CONTAINER_ID> /bin/bash
fonte
docker run <containerID>
Peguei a resposta de @ Dmitriusan e criei um pseudônimo:
Adicione isso ao seu
~/.bashrc
arquivo de alias e você terá um novodocker-run-prev-container
alias bacana que o colocará em um shell no contêiner anterior.Útil para depuração
docker build
s com falha .fonte
Não é exatamente isso que você está pedindo, mas você pode usar
docker export
em um contêiner parado se tudo o que você deseja é inspecionar os arquivos.fonte
Não foi especificado se o contêiner está saindo, apenas que seu código falha e você precisa ver o que está acontecendo no contêiner. Se não estiver saindo, aqui está outra solução em potencial.
Obtenha o ID do contêiner com
docker ps
docker exec -it 665b4a1e17b6 /bin/sh
Se o ponto de entrada estiver definido como algo problemático, ele também poderá ser substituído, conforme sugerido na resposta de Dmitriusan. Também deve ser observado que você pode anexar a qualquer contêiner em execução
docker attach
. Tantas soluções soluções diferentes. Só não vejo a necessidade de me comprometer com a imagem. Parece desnecessário.Documentos para o executivo do Docker - https://docs.docker.com/engine/reference/commandline/exec/
Anexo do Docs for Docker - https://docs.docker.com/engine/reference/commandline/attach/
fonte
Na verdade, eu discordo de ambas as respostas. Se você quiser apenas ver o que há no contêiner, execute este comando para obter um shell. Não há necessidade de alterar o ponto de entrada em nenhuma ou em nenhuma das configurações.
fonte
docker logs <container_id> --follow
fornecerá o que você precisa. Outra alternativa é usar o comando acima e iniciar o serviço de falha nessa imagem com o mesmo comando no dockerfile e depurar a partir daí.fonte