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

Dans Docker 1.1.2 (dernière version), quelle est la manière correcte de se détacher d’un conteneur sans l’arrêter?

Donc, par exemple, si j’essaie:

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

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

exit et CTR+C arrêtent le conteneur.

Mise à jour: Comme mentionné dans les réponses ci-dessous, Ctrl + p , Ctrl + q transformera désormais le mode interactif en mode démon.


Eh bien, Ctrl + C (ou Ctrl + \ ) devrait vous détacher du conteneur mais il tuera le conteneur 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 complet. Lorsque vous exécutez un conteneur, le processus que vous lancez prend le PID 1 et prend le pouvoir init. Ainsi, lorsque ce processus est terminé, le démon arrête le conteneur jusqu’à ce qu’un nouveau processus soit lancé (via le démarrage de docker) (Plus d’informations à 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 plus simple est de suivre le tutoriel openssh sur 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)

Tapez Ctrl + p , Ctrl + q vous aidera à passer du mode interactif au 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") 

J’ai creusé dans cela et toutes les réponses ci-dessus sont partiellement correctes. Tout dépend de la façon dont le conteneur est lancé. Cela se résume à ce qui suit lorsque le conteneur a été lancé:

  • était un ATS atsortingbué ( -t )
  • était stdin laissé ouvert ( -i )

^P^Q fonctionne BUT: vous devez spécifier -t et -i lorsque vous lancez 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+c ne fonctionne PAS MAIS: vous devez seulement spécifier -t lorsque vous lancez 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 y a un moyen de se détacher sans tuer le conteneur; vous avez besoin d’un autre shell. En résumé, exécutez ceci dans un autre shell détaché et laissez le conteneur exécutant 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.

Si vous faites “docker attach” id du conteneur “vous entrez dans le conteneur. Pour quitter le conteneur sans arrêter le conteneur, vous devez entrer” Ctrl + P + Q ”

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


Je voudrais append une autre option ici qui consiste à exécuter le conteneur comme suit

 docker run -dti foo bash 

Vous pouvez ensuite entrer dans le conteneur et lancer bash avec

 docker exec -ti ID_of_foo bash 

Pas besoin d’installer sshd 🙂

La méthode par défaut pour se détacher d’un conteneur interactif est Ctrl + P Ctrl + Q , mais vous pouvez la remplacer lorsque vous exécutez un nouveau conteneur ou que vous vous connectez à un conteneur existant à l’ aide de l’indicateur –detach-keys .

Si vous vous docker attach via docker attach , vous pouvez détacher en tuant le processus de connexion au docker. 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 .

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 (qui ne fonctionne pas toujours).

Par exemple, lorsque vous exécutez le 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 touches 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 remplacement 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’ --detach-keys="" avec la commande docker attach. Le format de la est soit une lettre [aZ] , soit la combinaison de ctrl- avec l’un des éléments suivants:

  • az (un caractère alpha minuscule unique)
  • @ (arobase)
  • [(parenthèse gauche)
  • \ (deux barres obliques)
  • _ (souligner)
  • ^ (caret)

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

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

Si vous voulez simplement voir la sortie du processus s’exécuter depuis le conteneur, vous pouvez faire un simple docker container logs -f .

L’indicateur -f fait en sorte que la sortie du conteneur est followed et mise à jour en temps réel. Très utile pour le débogage ou la surveillance.