349 votes

Est-il possible de démarrer une session shell dans un conteneur en cours d'exécution (sans ssh) ?

Je m'attendais naïvement à ce que cette commande exécute un shell bash dans un conteneur en cours d'exécution :

docker run "id of running container" /bin/bash

il semble que ce ne soit pas possible, je reçois l'erreur :

2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842

Ainsi, si je veux exécuter le shell bash dans un conteneur en cours d'exécution (par exemple, à des fins de diagnostic)

Dois-je utiliser un serveur SSH et me connecter via ssh ?

1 votes

docker run CONTAINER est prévue dans la version 1.0

7 votes

Depuis la version 1.3 de Docker, vous devriez vraiment faire ce qui est décrit dans la section cette réponse

1 votes

Juste docker attach container_name

621voto

Michael_Scharf Points 792

Avec docker 1.3, il y a une nouvelle commande docker exec . Cela vous permet d'entrer dans un docker en cours d'exécution :

docker exec -it "id of running container" bash

3 votes

Cela a bien fonctionné pour moi. Un ajout très utile à docker run.

0 votes

Que se passe-t-il si j'effectue des modifications pendant l'exécution d'un conteneur en cours d'exécution et que je souhaite refléter les modifications en ligne ? Quelles sont les meilleures pratiques ?

0 votes

Très utile. Merci à vous

290voto

creack Points 11635

EDIT : Maintenant vous pouvez utiliser docker exec -it "id of running container" bash ( doc )

Auparavant, la réponse à cette question était :

Si vous devez vraiment le faire et que vous êtes dans un environnement de débogage, vous pouvez le faire : sudo lxc-attach -n <ID> Notez que l'identifiant doit être complet ( docker ps -notrunc ).

Cependant, je vous le déconseille fortement.

avis : -notrunc est déprécié, il sera remplacé par --no-trunc bientôt.

1 votes

Pourquoi le déconseillez-vous ?

0 votes

Voici un cas d'utilisation : j'ai un serveur nginx et je veux voir les logs, le cas d'utilisation plus général est d'avoir un serveur qui persiste l'état de travail dans des fichiers (ex. base de données) et de vouloir voir les fichiers ou simplement voir leur taille.

7 votes

Je vous le déconseille car 1) cela nécessite un noyau très récent, 2) Vous faites des choses en dehors de docker donc vous ne pourrez pas le suivre (logs, attach, etc). En outre, docker pourrait utiliser lxc en ce moment, mais il n'y a aucune garantie qu'il le fera pour toujours.

15voto

maxou Points 46

Fais-le.

docker attach container_name

Comme mentionné dans les commentaires, pour se détacher du conteneur sans l'arrêter, tapez Ctrlp puis Ctrlq .

5 votes

Merci ! Cela m'a aidé. Et dans le contexte de la question actuelle, je voudrais ajouter quelque chose. Après avoir débogué notre conteneur en utilisant , docker attach container_name utiliser ctrl p y ctrl q au lieu de exit . exit arrête le conteneur, alors que la commande ctrlp y ctrl q détache juste ce conteneur et le laisse fonctionner

10voto

Teudimundo Points 1055

Comme les choses évoluent, pour le moment, la méthode recommandée pour accéder à un conteneur en cours d'exécution est d'utiliser nsenter .

Vous pouvez trouver plus d'informations à ce sujet Dépôt Github . Mais en général, vous pouvez utiliser nsenter comme ceci :

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

ou vous pouvez utiliser le wrapper docker-enter :

docker-enter <container_name_or_ID>

Une bonne explication sur le sujet se trouve sur l'article du blog de Jérôme Petazzoni : Pourquoi vous n'avez pas besoin d'exécuter sshd dans vos conteneurs docker

0 votes

Malheureusement, les variables d'environnement sont mélangées en utilisant cette approche (si vous voulez vérifier les variables créées par le lien). Je suggère de faire source /proc/*/environ .

8voto

Alessandro Points 155

La première chose que vous ne pouvez pas exécuter

docker run "existing container" command

Parce que cette commande attend un image et non un conteneur et il en résulterait de toute façon la création d'un nouveau conteneur (donc pas celui que vous vouliez regarder).

Je suis d'accord avec le fait qu'avec Docker nous devrions nous pousser à penser d'une manière différente (donc vous devriez trouver des moyens pour ne pas avoir besoin de vous connecter au conteneur), mais je le trouve toujours utile et voici comment je le contourne.

J'exécute mes commandes via le superviseur en mode DEAMON.

Ensuite, j'exécute ce que j'appelle docker_loop.sh Le contenu est à peu près le suivant :

#!/bin/bash
/usr/bin/supervisord
/usr/bin/supervisorctl
while ( true )
    do
    echo "Detach with Ctrl-p Ctrl-q. Dropping to shell"
    sleep 1
    /bin/bash
done

Ce qu'il fait, c'est qu'il vous permet de vous "attacher" au conteneur et d'être présenté avec les supervisorctl pour arrêter/démarrer/redémarrer et vérifier les journaux. Si cela ne suffit pas, vous pouvez Ctrl+D et vous entrerez dans un shell qui vous permettra de jeter un coup d'oeil comme s'il s'agissait d'un système normal.

VEUILLEZ ÉGALEMENT TENIR COMPTE du fait que ce système n'est pas aussi sûr que le fait d'avoir le conteneur sans coque. Prenez donc toutes les mesures nécessaires pour sécuriser votre conteneur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X