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 courant:

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

il semble que ce n'est 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 courir shell bash dans un conteneur courant (ex. à des fins diagnostiques)

est-ce que je dois lancer un serveur SSH et me connecter via ssh ?

293
demandé sur Cezar 2013-07-28 04:05:06

14 réponses

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 et que vous êtes dans un environnement de débogage, vous pouvez faire ceci: sudo lxc-attach -n <ID> Notez que la carte d'IDENTITÉ doit être complète ( docker ps -notrunc ).

cependant, je recommande fortement contre cela.

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

231
répondu creack 2017-02-06 14:37:25

avec docker 1.3, il y a une nouvelle commande docker exec . Cela vous permet d'entrer un docker courant:

docker exec -it "id of running container" bash
581
répondu Michael_Scharf 2018-01-25 04:16:17

Just do

docker attach container_name

comme indiqué dans les commentaires, pour détacher du conteneur sans l'arrêter, tapez Ctrl P puis Ctrl" 151950920 q .

12
répondu maxbellec 2014-11-07 10:37:46

étant donné que les choses bougent, à l'heure actuelle le moyen recommandé d'accéder à un conteneur courant est d'utiliser nsenter .

, Vous pouvez trouver plus d'informations sur cette 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 l'emballage docker-enter :

docker-enter <container_name_or_ID>

une belle explication sur le sujet se trouve sur le blog de Jérôme Petazzoni: pourquoi vous n'avez pas besoin d'exécuter sshd dans vos conteneurs docker

10
répondu Teudimundo 2014-08-20 07:23:37

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 il en résulterait de toute façon un nouveau conteneur étant engendré (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 que vous n'ayez pas besoin de vous connecter sur le conteneur), mais je je le trouve toujours utile et c'est comme ça que je m'y prends.

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

puis j'exécute 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

ce qu'il fait, c'est qu'il vous permet de" fixer "au conteneur et d'être présenté avec l'interface supervisorctl pour arrêter/démarrer/redémarrer et vérifier les journaux. Si cela ne devrait pas suffire, vous pouvez Ctrl+D et vous allez déposer dans un environnement qui vous permettra d'avoir un coup d'oeil autour de lui comme si c'était un système normal.

veuillez également tenir compte du fait que ce système n'est pas aussi sûr que d'avoir un conteneur sans coque, alors prenez toutes les mesures nécessaires pour sécuriser votre conteneur.

8
répondu Alessandro 2014-01-05 10:21:04

garder un oeil sur cette demande de traction: https://github.com/docker/docker/pull/7409

qui implémente le futur utilitaire docker exec <container_id> <command> . Lorsque cela est possible, il devrait être possible, par exemple, de démarrer et d'arrêter le service ssh à l'intérieur d'un conteneur en marche.

il y a aussi nsinit pour faire ceci: "nsinit fournit un moyen pratique pour accéder à un shell à l'intérieur de l'espace de nom d'un conteneur en cours d'exécution" , mais il semble difficile à obtenir en cours d'exécution. https://gist.github.com/ubergarm/ed42ebbea293350c30a6

4
répondu foz 2014-09-03 11:01:08

Il est en fait un moyen d'avoir une coquille dans le conteneur.

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

crée /root/runme.sh avec quelques astuces d'écran gnu:

# 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 pour créer une image" Paquet de développement " en haut de l'image de production avec tous les outils nécessaires, y compris ce truc d'écran.

1
répondu kolypto 2014-06-02 16:25:04

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 que l'image est construite, vous avez deux options en utilisant exec et attach:

  1. avec exec (que j'utilise), exécutez:

docker run --name $CONTAINER_NAME-dt $IMAGE_NAME

puis

docker exec -il $CONTAINER_NAME / bin /bash

et utilisation

CTRL+D pour détacher

  1. avec attache, exécuter:

docker run --name $CONTAINER_NAME -dit $IMAGE_NAME

puis

Docker attach $CONTAINER_NAME

et utilisation

CTRL+P et CTRL+Q à détacher

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

1
répondu tim 2014-11-26 09:36:07

Il y a deux façons.

avec attache

$ sudo docker attach 665b4a1e17b6 #by ID

avec exec

$ sudo docker exec - -t 665b4a1e17b6 #by ID
1
répondu gurubelli 2016-03-29 18:41:29

vous pouvez utiliser

docker exec -it <container_name> bash
1
répondu antikytheraton 2018-06-28 18:34:39

si le but est de vérifier les journaux de l'application, ce post 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 en utilisant 'Docker logs containerid'.

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

0
répondu Mark K. 2013-10-01 16:41:38

il est utile d'assigner un nom lors de l'exécution du conteneur. Vous n'avez pas besoin de refer container_id.

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

0
répondu Matsumoto Kazuya 2017-08-18 07:42:52

peut-être avez-vous été induit en erreur comme moi en pensant en termes de VMs lors de la mise au point de conteneurs. Mon conseil: Essayez de ne pas.

Les conteneurs

sont comme tout autre procédé. En effet, vous pourriez vouloir "d'attacher" à des fins de débogage (pensez à /proc//env ou strace -p ), mais c'est un cas très spécial.

normalement vous venez de "lancer" le processus, donc si vous voulez modifier la configuration ou lire les journaux, il suffit de créer un nouveau conteneur et faire bien sûr, vous écrivez les logs en dehors de cela en partageant des répertoires, en écrivant à stdout (donc les logs de docker fonctionnent) ou quelque chose comme ça.

pour le débogage, vous pourriez vouloir démarrer un shell, puis votre code, puis appuyez sur CTRL-p + Ctrl-q pour laisser le shell intact. De cette façon, vous pouvez rattacher en utilisant:

docker attach <container_id>

si vous voulez déboguer le conteneur parce qu'il fait quelque chose que vous ne vous attendez pas à ce qu'il fasse, essayez de le déboguer: https://serverfault.com/questions/596994/how-can-i-debug-a-docker-container-initialization

-2
répondu estani 2017-04-13 12:13:41

Pas de. Ce n'est pas possible. Utilisez quelque chose comme supervisord pour obtenir un serveur ssh si c'est nécessaire. Bien que, j'ai vraiment la question de la nécessité.

-4
répondu Nick Stinemates 2013-07-28 18:48:51