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
oudocker 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.
Mise à jour: Comme mentionné dans les réponses ci-dessous Ctrl+p, Ctrl+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)
Type Ctrl+p, Ctrl+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")
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:
-t
)-i
)^P^Q
ne 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+c
fonctionne, 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]$
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.
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 "
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 :)
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 .
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
.
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.
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 quitterdocker attach --detach-keys="a,b,c" test
- appuyez sur A
, puis sur B
, puis sur C
pour quitterExtrait 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:
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)