Comment se détacher d'un conteneur Docker sans l'arrêter

0
620

Les conteneurs Docker ont un mode interactif qui vous permet de connecter les flux d'entrée et de sortie de votre terminal au processus du conteneur. Appuyer sur Ctrl-C terminera généralement ce processus
, provoquant l'arrêt du conteneur. Voici pour se détacher d'une session sans arrêter le conteneur.

Se détacher sans arrêter

Docker prend en charge une combinaison de touches 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 ramené dans votre shell mais le processus précédemment attaché restera actif, gardant votre conteneur en cours d'exécution. Vous pouvez le vérifier en utilisant docker ps pour obtenir une liste des conteneurs en cours d'exécution.

Appuyez sur Ctrl-C ou exécutez la commande de sortie pour tuer 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 passera à l'état arrêté.

Modification de la séquence de détachement du clavier

Vous pouvez modifier la séquence de détachement pour qu'elle corresponde votre préférence ou éviter un conflit avec les raccourcis clavier honorés par votre application. Ajoutez une propriété detachKeys à votre fichier ~/.docker/config.json pour spécifier les clés que vous souhaitez utiliser.

Publicité

Docker prend en charge les caractères a-z et les symboles @, ^ et _, ainsi que le signe crochet gauche ([) et deux barres obliques inverses (\). Ceux-ci sont tous utilisés en conjonction avec la touche Ctrl- ; 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 de la touche d.

Modification de la séquence par conteneur

Au-delà de la modification de votre configuration globale, Docker accepte les remplacements de detachKeys par conteneur et par pièce jointe. Ajoutez l'indicateur –detach-keys aux commandes qui peuvent s'attacher aux processus de conteneur pour définir une séquence spécifique.

Les commandes qui le prennent en charge sont :

  • docker run
  • docker start
  • docker exec
  • docker attach

Voici comment attacher à un conteneur, puis utiliser Ctrl-d, suivi d'un trait de soulignement, pour détacher :

docker attach my-container –detach-keys=”Ctrl-d,_”

L'indicateur –detach-keys utilise le même format de séquence de touches que l'option de configuration detachKeys. L'indicateur remplace votre paramètre docker.json ; cela remplace à son tour la séquence Ctrl-P/Ctrl-Q par défaut de Docker.

Se détacher lorsque la séquence de clavier a gagné&# 8217;t Travail

Parfois, vous pouvez rencontrer un processus de conteneur qui refuse de se détacher, même lorsque vous exécutez la séquence de clavier. Cela peut arriver si le flux d'entrée du conteneur n'est pas connecté à votre terminal (indicateur -i) ou s'il n'a pas de pseudo-TTY alloué (indicateur -t). 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 l'attachement.

Publicité

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 processus docker.attach qui maintient la pièce jointe active.

Trouvez d'abord l'ID du processus de pièce jointe :

ps -ef | grep attach

Utilisez la sortie de ps pour identifier le processus docker.attach que vous devez tuer. La commande dans la colonne CMD doit identifier la pièce jointe que vous recherchez. Notez le numéro PID approprié et utilisez la commande kill pour arrêter ce processus :

kill -9 <PID>

Vous devriez voir votre shell 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 l'original.

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 marche. Votre terminal d'origine redevient utilisable et le conteneur reste en place.

Rattachement à votre conteneur

Vous pouvez vous rattacher aux conteneurs à l'aide de la commande docker attach. 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 l'indicateur –no-stdin. La sortie du conteneur sera diffusée dans votre terminal, mais vous ne pourrez fournir aucune entrée.

Publicité

Utilisez à nouveau la séquence du clavier pour détacher, ou Ctrl-C pour arrêter le processus et le conteneur. Si vous utilisez Ctrl-C ou quittez, 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 assez séquence de clavier 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. Les commandes Unix régulières telles que ps et kill doivent être utilisées dans ce scénario.

Enfin, si vous souhaitez que votre conteneur soit définitivement détaché, démarrez-le avec l'option -d (docker run -d my-image : dernier). 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 de la commande docker ps et peuvent être arrêtés avec docker stop my-container.