Agence web » Actualités du digital » Comment se détacher d’un conteneur Docker sans l’arrêter

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

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 terminera généralement cette
processus, provoquant l’arrêt du conteneur. Voici pour se détacher d’une session sans arrêter le conteneur.

Se détacher sans s’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éconnecter 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.

En appuyant sur Ctrl-C ou en exécutant le 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 un 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 personnages 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 de la d clé.

Modification de la séquence par conteneur

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

Les commandes qui le supportent 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,_"

Les --detach-keys flag utilise le même format de séquence de touches que le detachKeys option de configuration. Le drapeau prévaut sur votre docker.json réglage; 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 ne fonctionnera pas

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 (-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 l’attachement.

Il est toujours possible de détacher votre terminal du conteneur dans ces circonstances. Vous devez ouvrir temporairement une autre fenêtre de 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 doit identifier la pièce jointe que vous recherchez. Notez le numéro PID correspondant et utilisez le kill commande pour tuer 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 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 terminal d’origine redevient utilisable et le conteneur reste en place.

Rattachement à votre conteneur

Vous pouvez rattacher aux conteneurs en utilisant le docker attach commander. 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 du clavier pour détacher, ou Ctrl-C pour arrêter le processus et le conteneur. Si tu utilises Ctrl-C ou exit, docker attach définira le $? correctement dans votre shell afin que vous puissiez inspecter le code de sortie du conteneur.

Sommaire

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 drapeau (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 commande et peut être arrêté avec docker stop my-container.

★★★★★