Como você anexa e desanexa do processo do Docker?

459

Posso anexar a um processo de janela de encaixe, mas o Ctrl+ cnão funciona para desanexá-lo. exitbasicamente interrompe o processo.

Qual é o fluxo de trabalho recomendado para executar o processo, anexando-o ocasionalmente a ele para fazer algumas alterações e depois desanexando?

MarkL
fonte
4
Ao usar o nsenter, basta pressionar Ctrl-D.
user2105103
Faz fechando xterm, konsoleetc. trabalho? Funciona para mim (fico desapegado).
Vytenis Bivainis

Respostas:

668

Para desanexar o tty sem sair do shell, use a sequência de escape Ctrl+ Pseguida por Ctrl+ Q. Mais detalhes aqui .

Informações adicionais desta fonte :

  • docker run -t -i → pode ser desconectado ^P^Qe reconectado com o docker
  • docker run -i → não pode ser desanexado ^P^Q; vai atrapalhar stdin
  • docker run → não pode ser desanexado ^P^Q; pode cliente SIGKILL; pode reconectar com o docker
Ken Cochrane
fonte
46
Essa seria uma ótima resposta se realmente funcionasse como descrito nos documentos.
precisa saber é o seguinte
20
Descobri que, mesmo ao executar com -it, a sequência de desanexação falha se você também iniciar o contêiner com o sinalizador de limpeza (--rm). Isso pode ser óbvio para alguns, mas me morde com mais frequência do que gostaria de admitir.
allingeek
7
Outra opção é simplesmente fechar a janela do terminal ou CMD-w :)
buildmaestro
3
Você pode definir teclas de desanexação configuráveis com por exemplo "detachKeys": "ctrl-a,a"em seu arquivo .docker / config.json ou --detach-keys "ctrl-a,a"na linha de comando com anexar etc.
Matthew Hannigan
4
Ctrl + Znão se destaca; apenas embasa o processo. Não é o mesmo que desanexar e acarreta uma penalidade de desempenho.
Zenexer
178

Confira também a --sig-proxyopção :

docker attach --sig-proxy=false 304f5db405ec

Em seguida, use CTRL+ cpara desanexar

czerasz
fonte
4
Para tentar esta começando com execução em vez de anexar, eu tentei: docker run -ti --sig-proxy=false busybox top que não parece trabalho, o processo é morto com ctrl-c, mas começando com docker run -t -sig-proxy=false busybox top parecia de trabalho e permitir que parar com ctrl-c
Henning
Ctrl-cirá parar o recipiente também.
Evan Hu
É a única solução dentre as listadas aqui que funciona para mim no servidor Debian 9 executando o Docker 19.03.5. A pergunta é: por que essa não é a configuração padrão para os comandos anexar? Parece ser o caso de uso mais comum.
Feviktor 12/12/19
A sequência Ctrl-p, Ctrl-q não funciona para mim (iniciada como um anexo do docker anexar xyz) .. mas isso funciona. Obrigado @czerasz
PravyNandas
92

Se você quiser apenas fazer alguma modificação nos arquivos ou inspecionar processos, aqui está uma outra solução que você provavelmente deseja.

Você pode executar o seguinte comando para executar um novo processo a partir do contêiner existente:

sudo docker exec -ti [CONTAINER-ID] bash

iniciará um novo processo com o bash shell e você poderá escapar dele diretamente Ctrl+ C, pois isso não afetará o processo original.

Colin Su
fonte
6
Isso funcionou, você pode digitar "exit" quando terminar sem afetar o processo original.
Eko3alpha
Essa é uma ótima maneira de conectar-se a um contêiner em execução. Mas e se (digamos) eu tiver algum processo em execução no contêiner e desejar reiniciar esse processo? Ah, eu posso simplesmente matar o processo antigo, reiniciar o novo e usar Cp, Cq, que funciona porque é um tty interativo. Também gosto do método --sig-proxy = false, mas isso é mais versátil e não força a interrupção do processo atual.
taranaki
"anexar" tem um significado específico no Docker e execnão é.
frnhr
48

Acho que isso deve depender da situação.Tome o seguinte contêiner como exemplo:

# docker run -it -d ubuntu
91262536f7c9a3060641448120bda7af5ca812b0beb8f3c9fe72811a61db07fc
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         5 seconds ago       Up 4 seconds                            serene_goldstine

(1) Use " docker attach" para prender o recipiente:

Como " docker attach" não alocará um novo tty, mas reutilize o tty em execução original, portanto, se você executar o exitcomando, ele causará a saída do contêiner em execução:

# docker attach 91262536f7c9
exit
exit
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
91262536f7c9        ubuntu              "/bin/bash"         39 minutes ago      Exited (0) 3 seconds ago                       serene_goldstine

Portanto, a menos que você realmente queira fazer a saída do contêiner em execução, use Ctrl+ p+ Ctrl+ q.

(2) Use " docker exec"

Uma vez que " docker exec" irá alocar um novo tty, então eu acho que você deve usar exitem vez de Ctrl+ p+ Ctrl+ q.

A seguir está executando Ctrl+ p+ Ctrl+ qpara sair do contêiner:

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss   04:03   0:00 bash
root        28  0.0  0.0  15564  1148 ?        R+   04:03   0:00 ps -aux
root@91262536f7c9:/# echo $$
15

Em seguida, faça o login no contêiner novamente e você verá que o bashprocesso em docker execcomando preventivo ainda está ativo (o PID é 15):

# docker exec -it 91262536f7c9 bash
root@91262536f7c9:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18160  1908 ?        Ss+  04:03   0:00 /bin/bash
root        15  0.0  0.0  18164  1892 ?        Ss+  04:03   0:00 bash
root        29  0.0  0.0  18164  1888 ?        Ss   04:04   0:00 bash
root        42  0.0  0.0  15564  1148 ?        R+   04:04   0:00 ps -aux
root@91262536f7c9:/# echo $$
29
Nan Xiao
fonte
39

Para desconectar de um contêiner em execução, use ^P^Q(mantenha Ctrlpressionado P, pressione Q, pressione , solte Ctrl).

Existe um problema: isso só funciona se o contêiner foi iniciado com ambos -t e -i.

Se você tiver um contêiner em execução iniciado sem uma (ou ambas) dessas opções e se conectar docker attach, precisará encontrar outra maneira de desanexar. Dependendo das opções que você escolheu e do programa em execução, ^Cpode funcionar ou pode matar o contêiner inteiro. Você terá que experimentar.

Outro problema: dependendo dos programas que você está usando, seu terminal, shell, cliente SSH ou multiplexador pode estar interceptando um ^Pou ^Q(geralmente o último). Para testar se esse é o problema, tente executar ou anexar ao --detach-keys zargumento. Agora você deve conseguir desconectar pressionando z, sem nenhum modificador. Se isso funcionar, outro programa está interferindo. A maneira mais fácil de contornar isso é definir sua própria sequência de desanexação usando o --detach-keysargumento (Por exemplo, para sair com ^K, use --detach-keys 'ctrl-k'.) Como alternativa, você pode tentar desativar a interceptação das chaves no seu terminal ou em outro programa interferente. Por exemplo, stty start ''ou stty start undefpode impedir que o terminal intercepte^Q em alguns sistemas POSIX, embora eu não tenha achado isso útil.

Zenexer
fonte
2
Super explicação precisa, funcionou como um encanto
Meir Gabay
27

quando nada mais funcionar, abra um novo terminal :

$ ps aux | grep attach
username  <pid_here>    ..............  0:00 docker attach <CONTAINER_HASH_HERE>
username  <another_pid> ..............  0:00 grep --color=auto attach
$ kill -9 <pid_here>
Adi Fatol
fonte
Que armadilha! Obrigado, esta é a única coisa que funcionou. -9não era necessário.
quer
Isso também mata o contêiner - talvez dependente de quais sinalizadores foram configurados.
AdamAL 28/08/19
1
Observe que se houver dois pids exibidos, o primeiro será o pai. Você deve usar o segundo pid para matar docker attache não seu pai.
Joeytwiddle
11

Para desconectar do contêiner, basta segurar Ctrle pressionar P+ Q.

Para anexar a um contêiner em execução, use:

$ docker container attach "container_name"
gXg
fonte
9

Eu tinha o mesmo problema ctrl- Pe Qnão funcionaria, nem ctrl- C... finalmente abri outra sessão do terminal e fiz "docker stop containerid " e "docker start containerid " e ele fez o trabalho. Esquisito.

Pierluigi Vernetto
fonte
Isso não funcionará se você iniciou o contêiner com --rmsinalizador. Ctrl+Pe Ctrl+Qfunciona se você iniciou o contêiner com -itsinalizador.
Aswath K
4

No mesmo shell, segure ctrlas teclas chave e de imprensa p, em seguida,q

Ravthiru
fonte
3
Isso funciona apenas se você iniciou o contêiner com -itsinalizador.
Aswath K
2

Estou em um Mac e, por algum motivo, Ctrl- p Ctrl- qsó funcionaria se eu também mantivesseShift

Jared Williams
fonte
1
  1. Abra um novo terminal
  2. Encontre o ID do contêiner em execução docker ps
  3. Mate o recipiente docker kill ${containerId}
Vyacheslav Cotruta
fonte
0

para interromper um processo do docker e liberar as portas, primeiro use ctrl- cpara sair do contêiner e use o docker ps para encontrar a lista de contêineres em execução. Em seguida, você pode usar a parada do contêiner do docker para interromper esse processo e liberar suas portas. O nome do contêiner que você pode encontrar no comando docker ps, que fornece o nome na coluna name. Espero que isso resolva suas dúvidas ....

Shankar
fonte
0

Se você apenas precisar que o processo do docker seja executado em segundo plano, poderá usar

Ctrl + Z

Esteja ciente de que não é um desapego real e vem com uma penalidade de desempenho. (Você pode retorná-lo ao primeiro plano com o bgcomando).

Outra opção é fechar o terminal, se você não precisar mais dele.

Tom
fonte
0

Para quem encontrou o mesmo problema que eu (não é possível desanexar sem matar o contêiner, mesmo ao definir a chave de desanexação) ......

Ao iniciar seus contêineres com docker-compose up -d

em vez de usar docker attach {container name}para exibir o log de rejeição ....

try docker-compose logs -f {service name} ctrl- cmata a cauda do log sem matar seu contêiner

{service name}sendo o serviço listado ao lado do seu arquivo docker-compose.yml .. (por exemplo, enquanto nome do contêiner = elk_logstash_1 -> nome do serviço = logstash

HTH

Lon Kaut
fonte
0

Atualizar

Normalmente, eu usei o docker attach para ver o que o STDOUT estava exibindo, para solucionar problemas de contêineres. Acabei de encontrar docker logs --follow 621a4334f97b, o que me permite ver o STDOUT, além de poder ctrl + c sem afetar a operação do contêiner! Exatamente o que eu sempre quis.

... naturalmente, você precisará substituir em seu próprio ID de contêiner.

Resposta original

Eu queria deixar o contêiner em execução, mas o tinha anexado sem iniciar o contêiner -it. Minha solução foi sacrificar minha conexão SSH (já que eu estava com SSH na máquina que estava executando os contêineres). Matar essa sessão ssh deixou o contêiner intacto, mas me destacou dele.

CenterOrbit
fonte