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

313

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

Ainsi, par exemple, si j'essaie:

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

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

exitet les CTR+Cdeux arrêtent le conteneur.

mtmacdonald
la source
Le "conteneur" n'est qu'un ensemble d'espaces de noms restreints (un espace de noms de processus, un espace de noms de système de fichiers, etc.) dans lesquels les processus peuvent s'exécuter. Si vous n'avez aucun processus à l'intérieur d'un espace de noms, cet espace de noms existe-t-il vraiment? Ce n'est pas comme une machine virtuelle où il y a une interruption de l'horloge de réponse du noyau, etc. indépendamment.
Charles Duffy

Réponses:

166

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


Eh bien Ctrl+ C(ou Ctrl+ \) devrait vous détacher du conteneur mais cela tuera le conteneur car votre processus principal est un bash.

Une petite leçon sur le 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 la puissance d'initialisation. Donc, lorsque ce processus est terminé, le démon arrête le conteneur jusqu'à ce qu'un nouveau processus soit lancé (via le démarrage du docker) (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 de 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)

Regan
la source
3
+1 pour baseimage-docker. C'est formidable de savoir qu'il existe un modèle avec des conseils sur les parties dures de Docker.
mtmacdonald
Notez que ssh n'est pas strictement nécessaire: blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker
Adrian Mouat
1
l'exécution d'un contenu en mode -d était très utile. De plus, le lien pour démarrer ssh via Dockerfile m'a facilité la vie.
Ravi
56
Détachez en utilisant Ctrl-p, Ctrl-q. Les conseils de cette réponse vont tuer un conteneur.
taranaki
4
Cela a fonctionné pour moi (tiré de la réponse ci-dessous): Commencez par -ti -d, puis attachez avec docker attach, puis détachez avec d' abord ctrl + p puis ctrl + q. Je pensais que je pouvais utiliser un seul des raccourcis clavier.
CGFoX
526

Tapez Ctrl+ ppuis Ctrl+ q. Il 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")
Larry Cai
la source
4
Cela semble ne pas fonctionner avec (essayer de quitter un conteneur Wekan attaché).
danger89
7
J'ai souvent visité cette page car je ne me souvenais pas précisément de cette combinaison de touches! :-D
Thamme Gowda
10
@ danger89 ctrl-p, ctrl-q ne fonctionnera que lorsque vous aurez démarré votre conteneur en mode interactif (-it). Si vous l'avez démarré en mode démon (-d) et que vous y êtes attaché, vous pouvez simplement le quitter et il fonctionnera toujours en arrière-plan.
Riscie
1
@SlimShady appuyez sur Ctrl + P puis sur Ctrl + Q pour quitter, pas l'un d'eux mais, les deux dans cet ordre.
Mohyaddin Alaoddin
160

J'ai creusé 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 attribué ( -t)
  • a été stdin laissé ouvert ( -i)

^P^Q fonctionne, MAIS uniquement lorsque -tet -iest utilisé 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+c fonctionne, MAIS uniquement 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 détaché et laisser le conteneur en cours d'exécution 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.

berto
la source
2
la troisième voie fonctionne pour moi. Merci. si vous attachez à plusieurs instances et que vous ne souhaitez en détacher qu'une. Peut tuer le processus spécifique: ps -ef | grep attach -> get pid. Puis: tuer -9 <pid>
phanhuy152
pkill est la seule chose qui a fonctionné pour moi après l'attachement de docker
sm4rk0
Pourquoi avons-nous besoin du -9. J'ai remarqué que si nous n'utilisions pas le -9, il fermait le conteneur.
Angelo
D'autres signaux sont cela, des signaux. Ils indiquent au processus quel type de signal et lui donnent la possibilité d'agir et de faire quelque chose. Le kill -9signal ne fonctionne pas. Le processus est terminé et n'a aucun recours. Je suppose que d'autres signaux donnent au conteneur une chance de s'arrêter, alors que ce -9n'est pas le cas.
berto
1
C'était super utile. Merci!
Evan Zamir
40

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

Ashwin
la source
6
mieux à Ctrl + P et Ctrl + Q
sib10
4
Ctrl + P, Q (toujours avec Ctrl);)
dimpiax
ça me rend:Error response from daemon: Container f560a0ad6806150b2775d0b6e6d5f7065a03775bae858fb4fb7df05a277976db is not running
Webwoman
31

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


Je voudrais ajouter 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 exécuter bash avec

docker exec -ti ID_of_foo bash

Pas besoin d'installer sshd :)

PiersyP
la source
Je pense que dans la deuxième commande, vous devez remplacer foo par l'ID de conteneur de foo
Nehal J Wani
Dans ce contexte, je pense que ce docker attachserait plus standard, en se rattachant à la première exécution de bash. docker execfonctionne également ici, mais il crée un nouveau processus bash en plus du premier. Bien sûr, le processus est créé dans le même contexte / environnement / conteneur que le premier, mais il est différent (une analogie serait d'ouvrir un nouvel onglet de terminal dans votre émulateur de terminal préféré).
thiagowfx
20

La méthode par défaut pour se détacher d'un conteneur interactif est Ctrl+ P Ctrl+ Q, mais vous pouvez le remplacer lors de l'exécution d'un nouveau conteneur ou de l'attachement à un conteneur existant à l' aide de l'indicateur --detach-keys .

éclateur
la source
17

Si vous vous êtes connecté docker attach, vous pouvez vous détacher en tuant le processus de connexion du docker. Le meilleur moyen est d'utiliser le paramètre sig-proxy pour éviter de passer le Ctrl + C à votre conteneur:

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

La même option est disponible pour la docker runcommande.

Alexis LEGROS
la source
6
Bien que --sig-proxy = false soit extrêmement utile, il ne fonctionne pas pour les conteneurs déjà attachés pour lesquels il n'a pas été spécifié. Le problème est qu'après l'attachement, il semble qu'il n'y ait AUCUN moyen de se détacher sans tuer le processus, y compris «tuer le processus d'attachement de docker». Cp, Cq ne fonctionne pas avec des conteneurs attachés, uniquement interactifs (comme la question l'utilise).
taranaki
1
Cela devrait être la réponse acceptée, y compris le commentaire de @taranaki, Ctrl + P, Q ne fonctionne pas pourphp:7.3-apache
MKaama
10

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

L' -findicateur fait en sorte que la sortie du conteneur soit followedmise à jour en temps réel. Très utile pour le débogage ou la surveillance.

agupta231
la source
8

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

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

Autres exemples:

  • docker attach --detach-keys="ctrl-a,x" test- appuyez sur CTRL+Apuis sur Xpour quitter
  • docker attach --detach-keys="a,b,c" test- appuyez sur A, puis B, puis Cpour 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. Cela est utile si la séquence par défaut de Docker entre en conflit avec la séquence de touches que vous utilisez pour d'autres applications. Il existe deux façons de définir votre propre séquence de touches 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="<sequence>"indicateur avec la commande docker attach. Le format du <sequence>est soit une lettre [a-Z], soit le ctrl-combiné avec l'un des éléments suivants:

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

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

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

Constantin Galbenu
la source
0

Ancien message, mais quittez puis redémarrez-le ... le problème est que si vous êtes sur une machine Windows Ctrl p ou Ctrl P sont liés pour imprimer ... quitter le début du conteneur ne devrait rien faire de mal

tmac
la source