Forma correcta de se separar de um contentor sem o parar

Na Docker 1.1.2 (última), Qual é a forma correcta de se separar de um contentor sem o parar?

por isso, por exemplo, se eu tentar:

  • docker run -i -t foo /bin/bash ou
  • docker attach foo (para contentor já em funcionamento)
Ambos me levam a um terminal no contentor, como saio do terminal do contentor sem o parar?

exit e CTR+C ambos parem o contentor.

 188
Author: mtmacdonald, 2014-08-12

9 answers

Actualizar: Como mencionado em baixo Respostas Ctrl+p, Ctrl+O q irá agora transformar o modo interactivo em Modo de servidor.


Assim Ctrl+C (ou Ctrl+\) deve desanexar você do recipiente, mas ele vai matar o recipiente uma vez que seu principal processo é o bash.

Uma pequena lição sobre o docker. O recipiente não é um SO totalmente funcional. Quando você executa um container o processo você lancem o PID 1 e assumam o poder init. Então, quando esse processo é terminado, o daemon pára o container até que um novo processo seja lançado (através do docker start) (mais explicação sobre o assunto http://phusion.github.io/baseimage-docker/#intro)

Se quiser um contentor que funcione em Modo desligado o tempo todo, sugiro que use

docker run -d foo

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

Ou pode relançar o seu contentor via
docker start foo

(será destacada por defeito)

 63
Author: Regan, 2018-06-12 12:31:27

Tipo Ctrl+p, Ctrl+O q ajudá-lo-á a transformar o modo interactivo no modo daemon.

Ver 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")
 433
Author: Larry Cai, 2016-12-22 21:15:50
Investiguei isto e todas as respostas acima estão parcialmente correctas. Tudo depende de como o recipiente é lançado. Resume-se ao seguinte quando o contentor foi lançado:
  • foi atribuído um TTY(-t)
  • o stdin estava aberto (-i)

^P^Q Funciona mas: tem de indicar -t e -i quando lança o contentor:

[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: precisa de especificar apenas -t quando lançar o contentor:

[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 nos separarmos

Há uma maneira de nos separarmos sem matar o contentor, mas precisamos de outra cápsula. Em resumo, executando isso em outra shell destacada e deixou o container funcionando 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]$
Porquê? Porque estás a matar o processo que te ligou ao Contentor, não ao Contentor em si.
 72
Author: berto, 2017-08-31 16:04:53

Se você faz "acoplador anexar" ID do contentor " você entra no contentor. Para sair do contentor sem parar o contentor, terá de introduzir "Ctrl+P + Q"

 33
Author: Ashwin, 2016-04-22 10:42:45
Acho que a resposta de Ashwin é a mais correcta, a minha resposta anterior é a seguinte.
Eu gostaria de adicionar outra opção aqui que é executar o container Como segue
docker run -dti foo bash

Você pode então entrar no recipiente e executar bash com

docker exec -ti ID_of_foo bash

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

 24
Author: PiersyP, 2017-07-10 18:13:11

A forma padrão para desanexar de um interativo recipiente é Ctrl+P Ctrl+Q, mas você pode substituí-lo quando estiver executando um novo recipiente ou anexar ao contentor existente usando a --detach-chaves bandeira.

 19
Author: splintor, 2017-12-05 13:52:14
Se se ligar através de docker attach, pode separar-se matando o processo de anexação do acoplador. A melhor maneira é usar o parâmetro Sig-proxy para evitar passar o Ctrl+C para o seu contentor:
docker attach --sig-proxy=false [container-name]

Está disponível a mesma opção para o comando docker run.

 9
Author: Alexis LEGROS, 2016-12-30 16:14:45

Poderá usar a opção --detach-keys quando executar docker attach para substituir a sequência predefinida CTRL+P, CTRL + Q (isso nem sempre funciona).

Por exemplo, quando correr docker attach --detach-keys="ctrl-a" test e carregar em CTRL+A irá sair do contentor, sem o matar.

Outros exemplos:

  • docker attach --detach-keys="ctrl-a,x" test - Pressione CTRL+A e depois X para sair
  • docker attach --detach-keys="a,b,c" test - pressione A, depois B, depois C para sair

Extracto da documentação oficial:

Se want, você pode configurar um cancelamento da sequência de Chave do acoplador para o desaperto. Isto é útil se a sequência padrão do acoplador entrar em conflito com a sequência chave que você usa para outras aplicações. Existem duas maneiras de definir sua própria seqüência de chave de desaperto, como um override por container ou como uma propriedade de configuração em toda a sua configuração.

Para anular a sequência de um contentor individual, use a opção --detach-keys="<sequence>" com o comando acoplador. O formato do <sequence> é uma letra [a-Z], ou o ctrl- combinado com um dos seguintes:

  • A-z (um único carácter Alfa minúsculo)
  • @ (ao sinal)
  • [(suporte esquerdo)
  • \ (dois cortes para trás)
  • _ (sublinhado)
  • ^ (cuidados)

Estes a, ctrl-a, X, ou ctrl-\\ os valores são todos exemplos de sequências de chaves válidas. Para configurar uma sequência de chaves predefinida de configuração diferente para todos os contentores, ver configuração ficheiro seccao.

nota: isto funciona desde a versão 1.10+ do docker (na altura desta resposta, a versão actual é 18.03)

 3
Author: Constantin Galbenu, 2018-04-25 10:09:13

Se só quiser ver a saída do processo a correr dentro do contentor, pode fazer um simples {[[0]}.

A bandeira -f faz com que a saída do contentor seja followed e actualizada em tempo real. Muito útil para depuração ou monitoramento.

 2
Author: agupta231, 2018-06-01 14:45:29