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

Je pensais naïvement que cette commande exécutait 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 

Donc, si je veux lancer le shell bash dans un conteneur en cours d’exécution (ex. À des fins de diagnostic)

dois-je exécuter un serveur SSH et me connecter via ssh?

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

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

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

Cependant, je recommande fortement contre cela.

remarque: -notrunc est obsolète, il sera bientôt remplacé par --no-trunc .

Avec docker 1.3, il existe une nouvelle commande docker exec . Cela vous permet d’entrer un menu fixe en cours d’exécution:

 docker exec -it "id of running container" bash 

Juste faire

 docker attach container_name 

Comme mentionné dans les commentaires, pour détacher le conteneur sans l’arrêter, tapez Ctrl p puis Ctrl q .

Comme les choses évoluent, 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 sur ce repository github . Mais en général, vous pouvez utiliser nsenter comme ceci:

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

ou vous pouvez utiliser le docker-enter wrapper:

 docker-enter  

Une belle explication sur le sujet peut être trouvée sur le blog de Jérôme Petazzoni: Pourquoi vous n’avez pas besoin de lancer sshd dans vos conteneurs Docker?

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

 docker run "existing container" command 

Parce que cette commande attend une image et non un conteneur et qu’il en résulterait un nouveau conteneur (donc pas celui que vous vouliez voir)

Je suis d’accord avec le fait qu’avec docker nous devrions nous pousser à penser différemment (vous devriez donc trouver des moyens pour que vous n’ayez pas besoin de vous connecter au conteneur), mais je le trouve toujours utile et c’est comme ça que je travaille autour de.

Je lance mes commandes via superviseur en mode DEAMON.

Ensuite, docker_loop.sh ce que j’appelle docker_loop.sh Le contenu est à peu près ceci:

 #!/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 

Qu’est-ce qu’il fait, c’est qu’il vous permet de “joindre” au conteneur et être présenté avec l’interface supervisorctl pour arrêter / démarrer / redémarrer et vérifier les journaux. Si cela ne suffit pas, vous pouvez Ctrl+D et vous plonger dans un shell qui vous permettra de jeter un coup d’oeil comme si c’était un système normal.

S’IL VOUS PLAÎT, PRENEZ EN COMPTE QUE ce système n’est pas aussi sûr que d’avoir le conteneur sans shell, alors prenez toutes les mesures nécessaires pour sécuriser votre conteneur.

Gardez un œil sur cette requête: https://github.com/docker/docker/pull/7409

Qui implémente l’utilitaire docker exec venir. Lorsque cela est disponible, il devrait être possible par exemple de démarrer et d’arrêter le service ssh dans un conteneur en cours d’exécution.

Il est également nsinit de le faire: “nsinit fournit un moyen pratique d’accéder à un shell à l’intérieur de l’espace de noms d’un conteneur en cours d’exécution” , mais il semble difficile de s’exécuter. https://gist.github.com/ubergarm/ed42ebbea293350c30a6

Il y a en fait un moyen d’avoir un shell dans le conteneur.

Supposons que votre /root/run.sh lance le processus, le gestionnaire de processus (superviseur) ou autre.

Créez /root/runme.sh avec quelques astuces sur gnu-screen:

 # Spawn a screen with two tabs screen -AdmS 'main' /root/run.sh screen -S 'main' -X screen bash -l screen -r 'main' 

Maintenant, vous avez vos démons dans l’onglet 0, et un shell interactif dans l’onglet 1. docker attach à tout moment pour voir ce qui se passe à l’intérieur du conteneur.

Un autre conseil est de créer une image “bundle de développement” sur l’image de production avec tous les outils nécessaires, y compris cette astuce.

voici ma solution

partie de DOckerfile:

 ... RUN mkdir -p /opt ADD initd.sh /opt/ RUN chmod +x /opt/initd.sh ENTRYPOINT ["/opt/initd.sh"] 

partie de “initd.sh”

 #!/bin/bash ... /etc/init.d/gearman-job-server start /etc/init.d/supervisor start #very important!!! /bin/bash 

Après la création de l’image, vous avez deux options en utilisant exec et attach:

  1. avec exec (que j’utilise), lancez:

docker run –name $ CONTAINER_NAME -dt $ IMAGE_NAME

puis

docker exec -it $ CONTAINER_NAME / bin / bash

et utilise

CTRL + D pour détacher

  1. avec attach, run:

docker run –name $ CONTAINER_NAME -dit $ IMAGE_NAME

puis

docker attach $ CONTAINER_NAME

et utilise

CTRL + P et CTRL + Q pour détacher

la différence entre les options est dans le paramètre -i

Il y a deux façons.

Avec attache

 $ sudo docker attach 665b4a1e17b6 #by ID 

Avec exec

 $ sudo docker exec - -t 665b4a1e17b6 #by ID 

Vous pouvez utiliser

 docker exec -it  bash 

Si le but est de vérifier les journaux de l’application, cet article montre le démarrage de tomcat et le suivi du journal dans le cadre de CMD. Le journal tomcat est disponible sur l’hôte à l’aide de ‘docker logs containerid’.

http://blog.sortingfork.com/2013/08/15/using-docker-to-efficiently-create-multiple-tomcat-instances/

Il est utile d’atsortingbuer un nom lors de l’exécution du conteneur. Vous n’avez pas besoin de vous référer à container_id.

docker run --name container_name yourimage docker exec -it container_name bash

Peut-être avez-vous été trompé en pensant aux VM lors du développement de conteneurs. Mon conseil: Essayez de ne pas le faire.

Les conteneurs sont comme n’importe quel autre processus. En effet, vous voudrez peut-être leur “attacher” à des fins de débogage (pensez à / proc // env ou strace -p), mais c’est un cas très spécial.

Normalement, vous exécutez simplement le processus, donc si vous souhaitez modifier la configuration ou lire les journaux, créez simplement un nouveau conteneur et assurez-vous d’écrire les journaux en partageant les répertoires, en écrivant sur stdout (pour que le journal fonctionne) ou quelque chose comme ça.

Pour des raisons de débogage, vous pouvez lancer un shell, puis votre code, puis appuyer sur CTRL-p + CTRL-q pour laisser le shell intact. De cette façon, vous pouvez rattacher en utilisant:

 docker attach  

Si vous voulez déboguer le conteneur parce qu’il fait quelque chose que vous ne vous attendez pas à voir faire, essayez de le déboguer: https://serverfault.com/questions/596994/how-can-i-debug-a-docker-container -initialisation

Non, ce n’est pas possible. Utilisez quelque chose comme supervisord pour obtenir un serveur ssh si nécessaire. Bien que je remette définitivement en question le besoin.