Eu esperava ingenuamente que este comando executasse um shell bash em um contêiner em execução:
docker run "id of running container" /bin/bash
parece que não é possível, recebo o erro:
2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842
Portanto, se eu quiser executar o bash shell em um contêiner em execução (por exemplo, para fins de diagnóstico)
eu tenho que rodar um servidor SSH nele e loggin via ssh?
docker run CONTAINER
está planejado em 1.0docker attach container_name
Respostas:
EDIT: agora você pode usar
docker exec -it "id of running container" bash
( doc )Anteriormente, a resposta a esta pergunta era:
Se você realmente precisa e está em um ambiente de depuração, pode fazer o seguinte:
sudo lxc-attach -n <ID>
Observe que o ID precisa ser completo (docker ps -notrunc
).No entanto, eu recomendo fortemente contra isso.
aviso:
-notrunc
está descontinuado, será substituído por em--no-trunc
breve.fonte
lxc-attach
deve funcionar bem. Acabei de dobrar o cheque e funciona para mim. (Observe que ele não funcionará com o kernel anterior ao 3.8).docker -d -e lxc
docker run -v /var/log/nginx -name somename imagename command
; 2) executar um outro recipiente para visualizar o conteúdo do volume de dados:docker run -volumes-from somename -i -t busybox /bin/sh
.Com a janela de encaixe 1.3, há um novo comando
docker exec
. Isso permite que você insira uma janela de encaixe em execução:fonte
docker ps
para obter id de instâncias em execuçãodocker inspect <image>
para ver qual shell está disponível. Por exemplo, corradocker exec -it <container id> /bin/sh
.Apenas faça
Conforme mencionado nos comentários, para desconectar do contêiner sem pará-lo, digite Ctrlpentão Ctrlq.
fonte
docker attach container_name
usectrl p
e emctrl q
vez deexit
.exit
comando pára o recipiente, onde, comoctrlp
ectrl q
apenas destaca que recipiente e mantém funcionandoComo as coisas estão mudando, no momento está sendo usada a maneira recomendada de acessar um contêiner em execução
nsenter
.Você pode encontrar mais informações neste repositório do github . Mas, em geral, você pode usar o nsenter assim:
ou você pode usar o wrapper
docker-enter
:Uma boa explicação sobre o assunto pode ser encontrada na entrada do blog de Jérôme Petazzoni: Por que você não precisa executar o sshd nos contêineres do docker
fonte
source /proc/*/environ
.Primeira coisa que você não pode executar
Como esse comando espera uma imagem e não um contêiner e, de qualquer maneira, resultaria em um novo contêiner (o que você queria ver)
Concordo com o fato de que, com o docker, devemos nos esforçar para pensar de uma maneira diferente (para que você encontre maneiras de não precisar fazer logon no contêiner), mas ainda acho útil e é assim que trabalho em torno dele.
Eu executo meus comandos através do supervisor no modo DEAMON.
Em seguida, executo o que chamo de
docker_loop.sh
conteúdo:O que ele faz é que ele permite que você "se conecte" ao contêiner e seja apresentado à
supervisorctl
interface para parar / iniciar / reiniciar e verificar os logs. Se isso não for suficiente, você podeCtrl+D
e vai cair em um shell que permitirá que você dê uma olhada como se fosse um sistema normal.POR FAVOR, TENHA EM CONTA TAMBÉM que este sistema não é tão seguro quanto ter o contêiner sem casca, portanto, tome todas as medidas necessárias para proteger seu contêiner.
fonte
Fique de olho nesta solicitação de recebimento : https://github.com/docker/docker/pull/7409
O que implementa o próximo
docker exec <container_id> <command>
utilitário. Quando disponível, deve ser possível, por exemplo, iniciar e parar o serviço ssh dentro de um contêiner em execução.Também é
nsinit
necessário fazer o seguinte: "O nsinit fornece uma maneira útil de acessar um shell dentro do namespace de um contêiner em execução" , mas parece difícil continuar executando. https://gist.github.com/ubergarm/ed42ebbea293350c30a6fonte
docker exec
desembarcou em Docker 1.3, por isso agora é possível criar e participar de uma nova sessão de shell em um recipiente correndoVocê pode usar
fonte
Na verdade, existe uma maneira de ter um shell no contêiner.
Suponha que você
/root/run.sh
inicie o processo, o gerente de processos (supervisor) ou o que for.Crie
/root/runme.sh
com alguns truques da tela gnu:Agora, você tem seus daemons na guia 0 e um shell interativo na guia 1.
docker attach
a qualquer momento para ver o que está acontecendo dentro do contêiner.Outro conselho é criar uma imagem de "pacote de desenvolvimento" em cima da imagem de produção com todas as ferramentas necessárias, incluindo este truque de tela.
fonte
aqui está a minha solução
parte do DOckerfile:
parte de "initd.sh"
depois que a imagem é criada, você tem duas opções usando exec e anexar:
docker run --name $ CONTAINER_NAME -dt $ IMAGE_NAME
então
docker exec -it $ CONTAINER_NAME / bin / bash
E use
CTRL + D para desanexar
docker run --name $ CONTAINER_NAME -ditar $ IMAGE_NAME
então
docker anexar $ CONTAINER_NAME
E use
CTRL + P e CTRL + Q para desanexar
diferença entre as opções está no parâmetro -i
fonte
Existem duas maneiras.
Com anexo
Com exec
fonte
Se o objetivo é verificar os logs do aplicativo, esta postagem mostra a inicialização do tomcat e o tailing como parte do CMD. O log do tomcat está disponível no host usando 'docker logs containerid'.
http://blog.trifork.com/2013/08/15/using-docker-to-efficiently-create-multiple-tomcat-instances/
fonte
É útil atribuir um nome ao executar o contêiner. Você não precisa consultar container_id.
docker run --name container_name yourimage docker exec -it container_name bash
fonte
primeiro, obtenha o ID do contêiner desejado,
você obterá algo como isto:
agora copie esse ID de contêiner e execute o seguinte comando:
fonte
Talvez você tenha se enganado, como eu, pensando em termos de VMs ao desenvolver contêineres. Meu conselho: tente não.
Os contêineres são como qualquer outro processo. De fato, você pode querer "anexar" a eles para fins de depuração (pense em / proc // env ou strace -p), mas esse é um caso muito especial.
Normalmente, você apenas "executa" o processo; portanto, se você deseja modificar a configuração ou ler os logs, crie um novo contêiner e certifique-se de gravar os logs fora dele compartilhando diretórios, gravando no stdout (para que os logs do estivador funcionem) ou algo assim.
Para fins de depuração, você pode querer iniciar um shell, depois seu código, e pressionar CTRL-p + CTRL-q para deixar o shell intacto. Dessa forma, você pode reconectar usando:
Se você deseja depurar o contêiner porque está fazendo algo que não esperava, tente depurá-lo: /server/596994/how-can-i-debug-a-docker-container -inicialização
fonte
Não. Isso não é possível. Use algo como
supervisord
para obter um servidor ssh, se necessário. Embora eu definitivamente questione a necessidade.fonte