Comment attachez-vous et détachez-vous du processus de Docker?

459

Je peux m'attacher à un processus Docker mais Ctrl + cne fonctionne pas pour s'en détacher. exitstoppe essentiellement le processus.

Quel est le flux de travail recommandé pour que le processus s'exécute, s'y rattache parfois pour apporter des modifications, puis se détache?

MarkL
la source
4
Lorsque j'utilise nsenter, je viens de sortir Ctrl-D.
user2105103
La fermeture xterm, konsoleetc. fonctionne-t-elle? Ça marche pour moi (je me détache).
Vytenis Bivainis

Réponses:

668

Pour détacher le tty sans quitter le shell, utilisez la séquence d'échappement Ctrl+ Psuivie de Ctrl+ Q. Plus de détails ici .

Informations supplémentaires de cette source :

  • docker run -t -i → peut être détaché avec ^P^Qet fixé à nouveau avec docker attach
  • docker run -i → ne peut pas être détaché avec ^P^Q; va perturber stdin
  • docker run → ne peut pas être détaché avec ^P^Q; peut client SIGKILL; peut se rattacher avec un docker
Ken Cochrane
la source
46
Ce serait une excellente réponse si cela fonctionnait comme décrit dans la documentation.
allingeek
20
J'ai trouvé que même lors de l'exécution avec -it, la séquence de détachement échoue si vous démarrez également le conteneur avec l'indicateur de nettoyage (--rm). Cela peut être évident pour certains, mais cela me mord plus souvent que je ne voudrais l'admettre.
allingeek
7
Une autre option consiste à simplement fermer la fenêtre de votre terminal ou cmd-w :)
buildmaestro
3
Vous pouvez définir des clés de détachement configurables avec, par exemple, "detachKeys": "ctrl-a,a"dans votre fichier .docker / config.json ou --detach-keys "ctrl-a,a"sur la ligne de commande avec attacher, etc.
Matthew Hannigan
4
Ctrl + Zne se détache pas; il ne fait que mettre en contexte le processus. Ce n'est pas la même chose que le détachement et entraîne une pénalité de performance.
Zenexer
178

Découvrez également l' --sig-proxyoption :

docker attach --sig-proxy=false 304f5db405ec

Utilisez ensuite CTRL+ cpour détacher

czerasz
la source
4
Pour essayer cela en commençant par exécuter au lieu d'attacher, j'ai essayé: docker run -ti --sig-proxy=false busybox top ce qui ne semble pas fonctionner, le processus est tué avec ctrl-c mais en commençant par docker run -t -sig-proxy=false busybox top semble fonctionner et permettre de quitter avec ctrl-c
Henning
Ctrl-carrêtera également le conteneur.
Evan Hu
C'est la seule solution parmi celles listées ici qui fonctionne pour moi sur le serveur Debian 9 exécutant Docker 19.03.5. La question est, pourquoi n'est-ce pas le paramètre par défaut pour les commandes d'attachement? Il semble que ce soit le cas d'utilisation le plus courant.
fviktor
La séquence Ctrl-p, Ctrl-q ne fonctionne pas pour moi (démarrée comme docker container attach xyz) .. mais cela fonctionne. Merci @czerasz
PravyNandas
92

Si vous souhaitez simplement apporter des modifications aux fichiers ou inspecter les processus, voici une autre solution que vous souhaitez probablement.

Vous pouvez exécuter la commande suivante pour exécuter un nouveau processus à partir du conteneur existant:

sudo docker exec -ti [CONTAINER-ID] bash

démarrera un nouveau processus avec le shell bash, et vous pourriez y échapper par Ctrl+ Cdirectement, cela n'affectera pas le processus d'origine.

Colin Su
la source
6
Cela a fonctionné, vous pouvez taper "exit" une fois que vous avez terminé sans affecter le processus d'origine.
Eko3alpha
C'est un excellent moyen de l'attacher à un conteneur en cours d'exécution. Mais que se passe-t-il si (disons) j'ai un processus en cours d'exécution dans le conteneur et que je veux redémarrer ce processus? Ah, je peux simplement tuer l'ancien processus, redémarrer le nouveau et utiliser Cp, Cq, qui fonctionne car c'est un tty interactif. J'aime aussi la méthode --sig-proxy = false, mais elle est plus polyvalente et ne force pas la perturbation du processus actuel.
taranaki
"attacher" a une signification spécifique avec Docker, et execne l'est pas.
frnhr
48

Je pense que cela devrait dépendre de la situation. Prenons le conteneur suivant comme exemple:

# 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) Utilisez "docker attach " pour fixer le conteneur:

Puisque " docker attach" n'allouera pas un nouveau tty, mais réutilisera le tty en cours d'exécution d'origine, donc si vous exécutez la exitcommande, cela provoquera la sortie du conteneur en cours d'exécution:

# 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

Donc, à moins que vous ne vouliez vraiment exécuter la sortie du conteneur, vous devez utiliser Ctrl+ p+ Ctrl+ q.

(2) Utilisez " docker exec"

Depuis « docker exec» va allouer une nouvelle TTY, je pense que vous devriez utiliser au exitlieu de Ctrl+ p+ Ctrl+ q.

Ce qui suit exécute Ctrl+ p+ Ctrl+ qpour quitter le conteneur:

# 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

Ensuite, connectez-vous à nouveau au conteneur, vous verrez que le bashprocessus dans la docker execcommande précédente est toujours actif (PID est 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
la source
39

Pour vous détacher d'un conteneur en cours d'exécution, utilisez ^P^Q(maintenez la Ctrltouche P, appuyez Q, appuyez , relâchez Ctrl).

Il y a un hic: cela ne fonctionne que si le conteneur a été démarré avec les deux -t et -i.

Si vous avez un conteneur en cours d'exécution qui a été démarré sans l'une (ou les deux) de ces options et que vous vous y attachez docker attach, vous devrez trouver un autre moyen de le détacher. Selon les options que vous avez choisies et le programme en cours d'exécution, cela ^Cpeut fonctionner ou tuer le conteneur entier. Vous devrez expérimenter.

Un autre hic: selon les programmes que vous utilisez, votre terminal, shell, client SSH ou multiplexeur peut intercepter soit ^Pou ^Q(généralement ce dernier). Pour tester si c'est le problème, essayez d'exécuter ou de joindre avec l' --detach-keys zargument. Vous devriez maintenant pouvoir vous détacher en appuyant sur z, sans aucun modificateur. Si cela fonctionne, un autre programme interfère. La façon la plus simple de contourner ce problème consiste à définir votre propre séquence de détachement à l'aide de l' --detach-keysargument. (Par exemple, pour quitter avec ^K, utilisez --detach-keys 'ctrl-k'.) Alternativement, vous pouvez essayer de désactiver l'interception des clés dans votre terminal ou tout autre programme interférant. Par exemple, stty start ''oustty start undef peut empêcher le terminal d'intercepter^Q sur certains systèmes POSIX, même si je n'ai pas trouvé cela utile.

Zenexer
la source
2
Explication super précise, a fonctionné comme un charme
Meir Gabay
27

quand rien d'autre ne fonctionne, ouvrez un nouveau terminal puis:

$ 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
la source
Quel piège! Merci, c'est la seule chose qui a fonctionné. -9n'était pas nécessaire.
Heath Raftery
Cela tue également le conteneur - peut-être en fonction des drapeaux qui ont été définis.
AdamAL
1
Veuillez noter que si deux pids sont affichés, le premier est le parent. Vous devez utiliser le deuxième pid pour tuer docker attachet non son parent.
joeytwiddle
11

Pour vous détacher du conteneur, il vous suffit de tenir Ctrlet d'appuyer sur P+ Q.

Pour attacher à un conteneur en cours d'exécution que vous utilisez:

$ docker container attach "container_name"
gXg
la source
9

J'ai eu le même problème, ctrl- Pet Qne fonctionnerait pas, ni ctrl- C... finalement j'ai ouvert une autre session de terminal et j'ai fait "docker stop containerid " et "docker start containerid " et cela a fait le travail. Bizarre.

Pierluigi Vernetto
la source
Cela ne fonctionnera pas si vous avez démarré le conteneur avec --rmindicateur. Ctrl+Pet Ctrl+Qfonctionne si vous avez démarré le conteneur avec -itindicateur.
Aswath K
4

Dans la même coque, maintenez la ctrltouche et appuyez sur les touches ppuisq

ravthiru
la source
3
Cela ne fonctionne que si vous avez démarré le conteneur avec -itindicateur.
Aswath K
2

Je suis sur un Mac, et pour une raison quelconque, Ctrl- p Ctrl- qne fonctionnerait que si je tenais égalementShift

Jared Williams
la source
1
  1. Ouvrez un nouveau terminal
  2. Trouver l'ID du conteneur en cours d'exécution docker ps
  3. Tuez le conteneur docker kill ${containerId}
Vyacheslav Cotruta
la source
0

pour arrêter un processus de docker et libérer les ports, utilisez d'abord ctrl- cpour quitter la sortie du conteneur, puis utilisez docker ps pour trouver la liste des conteneurs en cours d'exécution. Ensuite, vous pouvez utiliser l'arrêt du conteneur Docker pour arrêter ce processus et libérer ses ports. Le nom du conteneur que vous pouvez trouver à partir de la commande docker ps qui donne le nom dans la colonne nom. J'espère que cela résoudra vos questions ....

Shankar
la source
0

Si vous avez seulement besoin que le processus de docker passe en arrière-plan, vous pouvez utiliser

Ctrl + Z

Sachez que ce n'est pas un vrai détachement et qu'il s'accompagne d'une pénalité de performance. (Vous pouvez le remettre au premier plan avec lebg commande).

Une autre option consiste à simplement fermer votre terminal, si vous n'en avez plus besoin.

À M
la source
0

Pour tous ceux qui ont rencontré le même problème que moi (ne peuvent pas se détacher sans tuer le conteneur, même lors du réglage de la clé de détachement) ......

Lors du démarrage de vos conteneurs avec docker-compose up -d

au lieu d'utiliser docker attach {container name}pour afficher le journal des résidus ....

essayer docker-compose logs -f {service name} ctrl- ctue la queue du journal sans tuer votre conteneur

{service name}étant le service répertorié dans le côté de votre fichier docker-compose.yml .. (par exemple lorsque le nom du conteneur = elk_logstash_1 -> nom du service = logstash

HTH

Lon Kaut
la source
0

Mise à jour

J'utilisais généralement Docker Attach pour voir ce que STDOUT affichait, pour dépanner les conteneurs. Je viens de trouverdocker logs --follow 621a4334f97b , ce qui me permet de voir le STDOUT tout en étant capable de le ctrl + c hors de lui sans affecter le fonctionnement du conteneur! Exactement ce que j'ai toujours voulu.

... naturellement, vous devrez remplacer votre propre ID de conteneur.

Réponse originale

Je voulais laisser le conteneur fonctionner, mais je l'avais attaché sans démarrer le conteneur avec -it. Ma solution était de sacrifier ma connexion SSH à la place (puisque j'étais SSHed dans la machine qui exécutait les conteneurs). Tuer cette session ssh a laissé le conteneur intact mais m'en a détaché.

CenterOrbit
la source