Maneira correta de desanexar de um contêiner sem pará-lo

313

No Docker 1.1.2 (mais recente), qual é a maneira correta de desanexar de um contêiner sem pará-lo?

Por exemplo, se eu tentar:

  • docker run -i -t foo /bin/bash ou
  • docker attach foo (para o contêiner já em execução)

sendo que ambos me levam a um terminal no contêiner, como saio do terminal do contêiner sem pará-lo?

exite CTR+Cambos param o contêiner.

mtmacdonald
fonte
O "contêiner" é apenas um conjunto de namespaces restritos (um namespace de processo, um namespace de sistema de arquivos, etc.) nos quais os processos podem ser executados. Se você não possui nenhum processo dentro de um namespace, esse namespace realmente existe? Não é como uma máquina virtual onde há um relógio de resposta do kernel interrompe & c. independentemente.
Charles Duffy

Respostas:

166

Update: Como mencionado em abaixo respostas Ctrl+ p, Ctrl+ qvai agora voltar modo interativo em modo daemon.


O poço Ctrl+ C(ou Ctrl+ \) deve desconectá-lo do contêiner, mas o mata porque o processo principal é um bash.

Uma pequena lição sobre estivador. O contêiner não é um sistema operacional totalmente funcional. Quando você executa um contêiner, o processo iniciado pega o PID 1 e assume o poder init. Portanto, quando esse processo é encerrado, o daemon para o contêiner até que um novo processo seja iniciado (via docker start) (Mais explicações sobre o assunto http://phusion.github.io/baseimage-docker/#intro )

Se você deseja um contêiner que é executado no modo desanexado o tempo todo, sugiro que você use

docker run -d foo

Com um servidor ssh no contêiner. (a maneira mais fácil é seguir o tutorial do dockerizing openssh https://docs.docker.com/engine/examples/running_ssh_service/ )

Ou você pode simplesmente reiniciar seu contêiner via

docker start foo

(será desanexado por padrão)

Regan
fonte
3
+1 para baseimage-docker. É ótimo saber que há um modelo com conselhos sobre as partes mais difíceis do Docker.
mtmacdonald
Note-se que ssh não é estritamente necessário: blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker
Adrian Mouat
1
executar um modo contido em -d foi muito útil. Além disso, o link para iniciar o ssh via Dockerfile facilitou minha vida.
Ravi
56
Desconecte usando Ctrl-p, Ctrl-q. O conselho desta resposta matará um contêiner.
Taranaki
4
Isso funcionou para mim (extraído da resposta abaixo): Comece com -ti -d, depois anexe com e docker attach, em seguida, desanexe com primeiro ctrl + pe depois ctrl + q. Eu pensei, eu poderia usar apenas um dos atalhos do teclado.
CGFoX 27/09/18
526

Digite Ctrl+ pe Ctrl+ q. Isso ajudará você a ativar o modo interativo para o modo daemon.

Consulte https://docs.docker.com/v1.7/articles/basics/#running-an-interactive-shell .

# To detach the tty without exiting the shell,
# use the escape sequence Ctrl-p + Ctrl-q
# note: This will continue to exist in a stopped state once exited (see "docker ps -a")
Larry Cai
fonte
4
Parece não funcionar com (tentando sair de um contêiner Wekan conectado).
danger89
7
Visitei esta página algumas vezes porque não conseguia me lembrar dessa combinação de teclas com precisão! :-D
Thamme Gowda
10
@ danger89 ctrl-p, ctrl-q só funcionará quando você iniciar seu contêiner com o modo interativo (-it). Se você o iniciou no modo deamon (-d) e o anexou, basta sair e ele ainda será executado em segundo plano.
Riscie
1
@SlimShady pressione Ctrl + P e, em seguida, Ctrl + Q para sair, não um deles, mas ambos nessa ordem.
Mohyaddin Alaoddin
160

Eu investiguei isso e todas as respostas acima estão parcialmente certas. Tudo depende de como o contêiner é lançado. Tudo se resume ao seguinte quando o contêiner foi iniciado:

  • foi um TTY alocado ( -t)
  • stdin foi deixado em aberto ( -i)

^P^Q funciona, MAS apenas quando -te -ié usado para iniciar o contêiner:

[berto@g6]$ docker run -ti -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q
read escape sequence

# i'm back to my prompt
[berto@g6]$ docker kill test; docker rm -v test
test
test

ctrl+c funciona, MAS apenas quando -t( sem -i ) é usado para iniciar o contêiner:

[berto@g6]$ docker run -t -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
018a228c96d6bf2e73cccaefcf656b02753905b9a859f32e60bdf343bcbe834d

[berto@g6]$ docker attach test
^C

[berto@g6]$    

A terceira maneira de desanexar

Existe uma maneira de desconectar sem matar o contêiner; você precisa de outro shell. Em resumo, executar isso em outro shell desanexado e deixou o contêiner em execução pkill -9 -f 'docker.*attach':

[berto@g6]$ docker run -d --name test python:3.6 /bin/bash -c 'while [ 1 ]; do sleep 30; done;'
b26e39632351192a9a1a00ea0c2f3e10729b6d3e22f8e0676d6519e15c08b518

[berto@g6]$ docker attach test
# here I typed ^P^Q and doesn't work
^P
# ctrl+c doesn't work either
^C
# can't background either
^Z

# go to another shell and run the `pkill` command above

# i'm back to my prompt
[berto@g6]$

Por quê? Porque você está matando o processo que o conectou ao contêiner, não ao contêiner em si.

berto
fonte
2
terceira maneira funciona para mim. Obrigado. se você estiver se conectando a várias instâncias e quiser desanexar apenas de uma. Pode matar o processo específico: ps -ef | grep attach -> get pid. Então: kill -9 <pid>
phanhuy152
pkill é a única coisa que funcionou para mim depois de estivador attach
sm4rk0
Por que precisamos do -9. Notei que se não usarmos o -9, ele desliga o contêiner.
Angelo
Outros sinais são isso, sinais. Eles dizem ao processo que tipo de sinal e dão a chance de agir e fazer alguma coisa. O kill -9sinal não. O processo é encerrado e não tem recurso. Meu palpite é que outros sinais dão ao contêiner a chance de desligar, enquanto -9não.
berto
1
Isso foi super útil. Obrigado!
Evan Zamir
40

Se você "encaixa" a ID do contêiner, entra no contêiner.Para sair do contêiner sem parar o contêiner, é necessário inserir Ctrl+ P+Q

Ashwin
fonte
6
melhor para Ctrl + P e Ctrl + Q
sib10 17/06
4
Ctrl + P, Q (ainda que prende Ctrl);)
dimpiax
ele me retorna:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Webwoman
31

Considero a resposta de Ashwin a mais correta, minha antiga resposta está abaixo.


Eu gostaria de adicionar outra opção aqui, que é executar o contêiner da seguinte maneira

docker run -dti foo bash

Você pode entrar no contêiner e executar o bash com

docker exec -ti ID_of_foo bash

Não é necessário instalar o sshd :)

PiersyP
fonte
Eu acho que no segundo comando você precisa substituir foo com o ID de recipiente de foo
Nehalem J Wani
Nesse contexto, acho docker attachque seria mais padrão, reconectando à primeira execução do bash. docker exectambém funciona aqui, no entanto, cria um novo processo de bash além do primeiro. Certamente, o processo é criado dentro do mesmo contexto / ambiente / contêiner do primeiro, porém é diferente (uma analogia seria abrir uma nova guia de terminal no seu emulador de terminal favorito).
Thiagowfx 3/07
20

A maneira padrão de desanexar de um contêiner interativo é Ctrl+ P Ctrl+ Q, mas você pode substituí-lo ao executar um novo contêiner ou anexá-lo a um contêiner existente usando o sinalizador --detach-keys .

splintor
fonte
16

Se você se conectou docker attach, é possível desconectar matando o processo de conexão da janela de encaixe. A melhor maneira é usar o parâmetro sig-proxy para evitar passar o Ctrl + C para o seu contêiner:

docker attach --sig-proxy=false [container-name]

A mesma opção está disponível para o docker runcomando.

Alexis LEGROS
fonte
6
Embora --sig-proxy = false seja extremamente útil, ele não funciona para contêineres já anexados para os quais não foi especificado. O problema é que, após a conexão, parece não haver maneira de desanexar sem interromper o processo, incluindo "interromper o processo de conexão da janela de encaixe". Cp, Cq não funciona com contêineres anexados, apenas com contêineres interativos (como a pergunta usa).
taranaki
1
Esta deve ser a resposta aceita, incluindo o comentário de @taranaki, Ctrl + P, Q não funciona.php:7.3-apache
MKaama 23/05/19
10

Se você quiser apenas ver a saída do processo em execução no contêiner, faça um simples docker container logs -f <container id>.

O -fsinalizador faz com que a saída do contêiner seja followedatualizada em tempo real. Muito útil para depuração ou monitoramento.

agupta231
fonte
8

Você pode usar a --detach-keysopção ao executar docker attachpara substituir o padrão CTRL+ P, CTRL+Q sequência (que nem sempre funciona).

Por exemplo, quando você executa docker attach --detach-keys="ctrl-a" teste pressiona CTRL+A , sai do contêiner sem matá-lo.

Outros exemplos:

  • docker attach --detach-keys="ctrl-a,x" test- pressione CTRL+Ae depoisX para sair
  • docker attach --detach-keys="a,b,c" test- pressione A, e Bdepois Cpara sair

Extrato da documentação oficial:

Se desejar, você pode configurar uma substituição da sequência de teclas do Docker para desanexar. Isso é útil se a sequência padrão do Docker entrar em conflito com a sequência de teclas usada para outros aplicativos. Há duas maneiras de definir sua própria sequência de chaves de desanexação, como uma substituição por contêiner ou como uma propriedade de configuração em toda a sua configuração.

Para substituir a sequência de um contêiner individual, use o --detach-keys="<sequence>"sinalizador com o comando docker attach. O formato do <sequence>é uma letra [a-Z]ou o ctrl-combinado com qualquer um dos seguintes:

  • az (um único caractere alfa em minúsculas)
  • @ (sinal de arroba)
  • [(colchete esquerdo)
  • \ (duas barras invertidas)
  • _ (sublinhado)
  • ^ (sinal de intercalação)

Estes a, ctrl-a, X, ou ctrl-\\valores são exemplos de sequências de teclas válidas. Para configurar uma sequência de teclas padrão de configuração diferente para todos os contêineres, consulte Configuração seção Arquivo de .

Nota: Isso funciona desde a janela de encaixe versão 1.10+ (no momento desta resposta, a versão atual é 18.03)

Constantin Galbenu
fonte
0

Postagem antiga, mas apenas saia e inicie novamente ... o problema é se você estiver em uma máquina Windows Ctrl p ou Ctrl P estão vinculadas à impressão ... sair do início do contêiner não deve prejudicar nada

tmac
fonte