web-dev-qa-db-fra.com

Manière correcte de détacher un conteneur sans l'arrêter

Dans Docker 1.1.2 (dernière version), quelle est la bonne façon de détacher un conteneur sans l'arrêter?

Donc, par exemple, si j'essaie:

  • docker run -i -t foo /bin/bash ou
  • docker attach foo (pour un conteneur déjà en cours d'exécution)

tous les deux qui me conduisent à un terminal dans le conteneur, comment puis-je quitter le terminal du conteneur sans l'arrêter?

exit et CTR+C arrêtent tous les deux le conteneur.

261
mtmacdonald

Mise à jour: Comme mentionné dans les réponses ci-dessous Ctrl+pCtrl+q passera maintenant du mode interactif au mode démon.


Bien Ctrl+C (ou Ctrl+\) devrait vous détacher du conteneur, mais le tuerait car votre processus principal est un bash.

Une petite leçon sur docker. Le conteneur n'est pas un véritable système d'exploitation pleinement fonctionnel. Lorsque vous exécutez un conteneur, le processus que vous lancez prend le PID 1 et assume le pouvoir d’initialisation. Donc, quand ce processus est terminé, le démon arrête le conteneur jusqu'à ce qu'un nouveau processus soit lancé (via docker start) (Plus d'explications à ce sujet http://phusion.github.io/baseimage-docker/#intro =)

Si vous voulez un conteneur qui fonctionne en mode détaché tout le temps, je vous suggère d'utiliser

docker run -d foo

Avec un serveur SSH sur le conteneur. (Le moyen le plus simple est de suivre le tutoriel dockerizing openssh https://docs.docker.com/engine/examples/running_ssh_service/ )

Ou vous pouvez simplement relancer votre conteneur via

docker start foo

(il sera détaché par défaut)

121
Regan

Type Ctrl+pCtrl+q vous aidera à activer le mode interactif en mode démon.

Voir 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")
475
Larry Cai

J'ai creusé dans cela et toutes les réponses ci-dessus sont partiellement correctes. Tout dépend de la manière dont le conteneur est lancé. Au moment du lancement du conteneur, voici ce qui se passe:

  • était un téléscripteur attribué (-t)
  • stdin était laissé ouvert (-i)

^P^Qne fonctionne, MAIS que lorsque -t et -i sont utilisés pour lancer le conteneur:

[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+cfonctionne, MAIS seulement lorsque -t (sans-i) est utilisé pour lancer le conteneur:

[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]$    

La troisième façon de se détacher

Il existe cependant un moyen de se détacher sans tuer le conteneur; vous avez besoin d'un autre Shell. En résumé, exécuter ceci dans un autre shell séparé et laisser le conteneur exécuter 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]$

Pourquoi? Parce que vous tuez le processus qui vous a connecté au conteneur, pas le conteneur lui-même.

127
berto

Si vous faites "attacher docker" conteneur id "vous entrez dans le conteneur. Pour quitter le conteneur sans arrêter le conteneur, vous devez entrer" Ctrl + P + Q "

35
Ashwin

Je considère que la réponse d'Ashwin est la plus correcte, mon ancienne réponse est ci-dessous.


docker run -dti foo bash

Vous pouvez ensuite entrer le conteneur et exécuter bash avec

docker exec -ti ID_of_foo bash

Pas besoin d'installer sshd :)

26
PiersyP

Le moyen par défaut de se détacher d'un conteneur interactif est Ctrl+PCtrl+Q, mais vous pouvez le remplacer lorsque vous exécutez un nouveau conteneur ou que vous vous connectez à un conteneur existant en utilisant le drapeau --detach-keys .

19
splintor

Si vous avez joint via docker attach, vous pouvez vous détacher en supprimant le processus de fixation du menu fixe. Le meilleur moyen consiste à utiliser le paramètre sig-proxy pour éviter de transmettre le Ctrl + C à votre conteneur:

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

La même option est disponible pour la commande docker run.

13
Alexis LEGROS

Si vous voulez juste voir la sortie du processus s'exécuter depuis le conteneur, vous pouvez faire un simple docker container logs -f <container id>.

Le drapeau -f permet de faire en sorte que la sortie du conteneur soit followed et mise à jour en temps réel. Très utile pour le débogage ou la surveillance.

8
agupta231

Vous pouvez utiliser l'option --detach-keys lorsque vous exécutez docker attach pour remplacer la séquence par défaut CTRL+P, CTRL + Q (cela ne fonctionne pas toujours).

Par exemple, lorsque vous exécutez docker attach --detach-keys="ctrl-a" test et que vous appuyez sur CTRL+A, vous quittez le conteneur sans le tuer.

Autres exemples:

  • docker attach --detach-keys="ctrl-a,x" test - appuyez sur CTRL+A puis sur X pour quitter
  • docker attach --detach-keys="a,b,c" test - appuyez sur A, puis sur B, puis sur C pour quitter

Extrait de la documentation officielle:

Si vous le souhaitez, vous pouvez configurer un remplacement de la séquence de touches Docker pour le détachement. Ceci est utile si la séquence par défaut de Docker est en conflit avec la séquence de clés que vous utilisez pour d'autres applications. Il existe deux manières de définir votre propre séquence de clés de détachement, en tant que substitution par conteneur ou en tant que propriété de configuration sur l'ensemble de votre configuration.

Pour remplacer la séquence d'un conteneur individuel, utilisez l'indicateur --detach-keys="<sequence>" avec la commande docker attach. Le format du <sequence> est soit une lettre [a-Z], soit le ctrl- combiné à l'un des éléments suivants:

  • a-z (un seul caractère alpha minuscule)
  • @ (arobase)
  • [(crochet gauche)
  • \ (deux barres obliques inversées)
  • _ (souligner)
  • ^ (caret)

Ces valeurs a, ctrl-a, X ou ctrl-\\ sont toutes des exemples de séquences de touches valides. Pour configurer une séquence de clé de configuration par défaut différente pour tous les conteneurs, voir la section Configuration fichier.

Remarque: cela fonctionne depuis la version 1.10+ de docker (au moment de cette réponse, la version actuelle est 18.03)

7
Constantin Galbenu