Les conteneurs Docker ont un mode interactif qui vous permet d'attacher les flux d'entrée et de sortie de votre terminal au processus du conteneur. Appuyer sur Ctrl-C mettra généralement fin à ce
processus, provoquant l'arrêt du conteneur. Voici pour se détacher d'une session sans arrêter le conteneur.
Détacher sans s'arrêter
Docker prend en charge une combinaison de clavier pour se détacher gracieusement d'un conteneur. Appuyez sur Ctrl-P, suivi de Ctrl-Q, pour vous détacher de votre connexion.
Vous serez renvoyé dans votre shell, mais le processus précédemment attaché restera actif, gardant votre conteneur en cours d'exécution. Vous pouvez vérifier cela en utilisant docker ps
pour obtenir une liste des conteneurs en cours d'exécution.
En appuyant sur Ctrl-C ou en exécutant la exit
La commande tuera généralement le processus de premier plan du conteneur à moins qu'il n'ait été spécialement configuré. Un conteneur Docker doit avoir un processus de premier plan en cours d'exécution ; un conteneur sans conteneur entrera dans l'état arrêté.
Modification de la séquence de détachement du clavier
Vous pouvez modifier la séquence de détachement en fonction de vos préférences ou éviter un conflit avec les raccourcis clavier honorés par votre application. Ajouter un detachKeys
propriété à votre ~/.docker/config.json
fichier pour spécifier les clés que vous souhaitez utiliser.
Docker prend en charge le a-z
caractères et @
, ^
, et _
, symboles, ainsi que le signe crochet gauche ([
) et deux barres obliques inverses (\
). Ceux-ci sont tous utilisés en conjonction avec le Ctrl-
clé; les lettres peuvent également être utilisées individuellement, sans Ctrl
.
Les séquences de touches sont exprimées sous forme de liste séparée par des virgules :
{ "detachKeys": "Ctrl-d,d" }
Cet exemple se détacherait du conteneur lorsque vous appuyez sur Ctrl-D
immédiatement suivi du d
clé.
Modification de la séquence par conteneur
Au-delà de la modification de votre configuration globale, Docker accepte les detachKeys
remplacements par conteneur et par pièce jointe. Ajoutez le --detach-keys
indicateur aux commandes pouvant être attachées aux processus de conteneur pour définir une séquence spécifique.
Les commandes qui prennent en charge ceci sont :
docker run
docker start
docker exec
docker attach
Voici comment attacher à un conteneur, puis utiliser Ctrl-d
, suivi d'un trait de soulignement, à détacher :
docker attach my-container --detach-keys="Ctrl-d,_"
Les --detach-keys
flag utilise le même format de séquence de touches que detachKeys
option de configuration. Le drapeau remplace votre docker.json
paramètre; cela remplace à son tour la séquence Ctrl-P/Ctrl-Q par défaut de Docker.
Se détacher lorsque la séquence du clavier ne fonctionne pas
Parfois, vous pouvez rencontrer un processus de conteneur qui refuse de se détacher, même lorsque vous émettez la séquence clavier. Cela peut arriver si le flux d'entrée du conteneur n'est pas connecté à votre terminal (-i
flag) ou il n'a pas de pseudo-TTY alloué (-t
drapeau). Vous pouvez également rencontrer ce problème si le processus de votre conteneur gère la séquence de touches de détachement et que vous ne l'avez pas remplacée lors de la connexion.
Il est toujours possible de détacher votre terminal du conteneur dans ces circonstances. Vous devez ouvrir temporairement une autre fenêtre shell et l'utiliser pour tuer le docker.attach
processus qui maintient la pièce jointe active.
Recherchez d'abord l'ID de processus du processus de pièce jointe :
ps -ef | grep attach
Utiliser la sortie de ps
pour identifier le docker.attach
processus que vous devez tuer. La commande dans le CMD
colonne doit identifier la pièce jointe que vous recherchez. Notez le numéro PID pertinent et utilisez le kill
commande pour tuer ce processus :
kill -9 <PID>
Vous devriez voir votre coque d'origine se détacher de votre conteneur Docker et revenir à un état de fonctionnement normal. Vous pouvez maintenant fermer le deuxième shell et continuer à utiliser celui d'origine.
Cette technique fonctionne en tuant le processus Docker CLI qui a attaché le terminal au conteneur, et non le processus dans le conteneur qui le maintient en cours d'exécution. Votre borne d'origine redevient utilisable et le conteneur reste en place.
Rattachement à votre conteneur
Vous pouvez vous rattacher aux conteneurs à l'aide du docker attach
commande. Cela attache automatiquement les flux d'entrée, de sortie et d'erreur de votre terminal au conteneur spécifié :
docker attach my-container
Les trois flux sont connectés par défaut. Vous pouvez omettre le flux d'entrée en passant le --no-stdin
drapeau. La sortie du conteneur sera diffusée dans votre terminal, mais vous ne pourrez fournir aucune entrée.
Utilisez à nouveau la séquence clavier pour détacher, ou Ctrl-C
pour arrêter le processus et le conteneur. Si vous utilisez Ctrl-C
ou exit
, docker attach
définira le $?
correctement dans votre shell afin que vous puissiez inspecter le code de sortie du conteneur.
Résumé
La bonne façon de se détacher d'un conteneur Docker est une séquence de clavier assez obscure qui vous ramène dans votre shell. Vous pouvez personnaliser cette séquence pour augmenter la mémorisation et éviter tout conflit avec la gestion du clavier de votre conteneur.
Les séquences de détachement du clavier peuvent être inefficaces dans certaines circonstances. Il est toujours possible de se détacher de votre conteneur en identifiant et en tuant le processus qui prend en charge la pièce jointe. Commandes Unix régulières telles que ps
et kill
doit être utilisé dans ce scénario.
Enfin, si vous souhaitez que votre conteneur soit définitivement détaché, démarrez-le avec le -d
flag (docker run -d my-image:latest
). Cela enverra le conteneur directement en arrière-plan et n'émettra aucune sortie vers votre shell. Les conteneurs détachés sont toujours visibles à l'aide du docker ps
et peut être arrêté avec docker stop my-container
.