web-dev-qa-db-fra.com

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

on dirait que ce n'est pas possible, j'ai l'erreur:

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

Donc, si je veux exécuter bash Shell dans un conteneur en cours d’exécution (par exemple à des fins de diagnostic)

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

325
Max L.

EDIT: vous pouvez maintenant 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 l'identifiant doit être complet (docker ps -notrunc).

Cependant, je recommande fortement contre cela.

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

270
creack

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

_docker exec -it "id of running container" bash
_
604
Michael_Scharf

Il suffit de faire

docker attach container_name

Comme mentionné dans les commentaires, pour détacher le conteneur sans l’arrêter, tapez Ctrlpensuite Ctrlq.

14
maxbellec

Comme les choses s'améliorent, la méthode recommandée pour accéder à un conteneur en cours d'exécution consiste à utiliser nsenter.

Vous pouvez trouver plus d'informations à ce sujet référentiel 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>

Vous trouverez une explication intéressante à ce sujet sur le blog de Jérôme Petazzoni: Pourquoi ne pas utiliser sshd dans ses conteneurs docker

10
Teudimundo

La première chose que vous ne pouvez pas courir

docker run "existing container" command

Parce que cette commande attend un image et non un conteneur et que de toute façon, un nouveau conteneur sera créé (donc pas celui que vous voulez regarder)

Je suis d'accord avec le fait qu'avec docker, nous devrions nous pousser à penser différemment (vous devez donc trouver des moyens pour ne pas avoir à 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, 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

Cela permet de vous "attacher" au conteneur et d’être présenté avec l’interface supervisorctl pour arrêter/démarrer/redémarrer et consulter les journaux. Si cela ne vous suffit pas, vous pouvez Ctrl+D et vous vous retrouverez dans un shell qui vous permettra de jeter un coup d'œil comme s'il s'agissait d'un système normal.

VEUILLEZ DE PLUS TENIR COMPTE QUE ce système n’est pas aussi sécurisé que le conteneur sans Shell, prenez donc toutes les mesures nécessaires pour sécuriser votre conteneur.

8
Alessandro

Gardez un œil sur cette demande d'extraction: https://github.com/docker/docker/pull/7409

Qui implémente l'utilitaire à venir docker exec <container_id> <command>. Lorsque cela est disponible, il devrait être possible, par exemple, de démarrez et arrêtez le service ssh dans un conteneur en cours d'exécution.

Il y a aussi nsinit pour faire ceci: "nsinit fournit un moyen pratique d'accéder à un shell dans l'espace de nom d'un conteneur en cours d'exécution" , mais difficile de courir. https://Gist.github.com/ubergarm/ed42ebbea293350c30a6

5
foz

Vous pouvez utiliser

docker exec -it <container_name> bash
3
antikytheraton

Il est utile d'attribuer un nom lors de l'exécution du conteneur. Vous n'avez pas besoin de faire référence à container_id.

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

1
Matsumoto Kazuya

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 gnu-screen:

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

Vous avez maintenant 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 de "lot de développement" par-dessus l'image de production avec tous les outils nécessaires, y compris cette astuce d'écran.

1
kolypto

voici ma solution

partie de DOckerfile:

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

une 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 construction de l'image, vous avez deux options: exec et attach:

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

exécution du menu fixe --nom $ CONTAINER_NAME -dt $ IMAGE_NAME

ensuite

docker exec -it $ CONTAINER_NAME/bin/bash

et utilise

CTRL + D à détacher

  1. avec attache, lancez:

docker run --name $ CONTAINER_NAME -dit $ IMAGE_NAME

ensuite

attacher le docker $ CONTAINER_NAME

et utilise

CTRL + P et CTRL + Q à détacher

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

1
tim

Il y a deux façons.

Avec attache

$ Sudo docker attach 665b4a1e17b6 #by ID

Avec exec

$ Sudo docker exec - -t 665b4a1e17b6 #by ID
1
gurubelli

Si l'objectif est de vérifier les journaux de l'application, cet article montre comment démarrer Tomcat et le suivre en tant que partie intégrante de CMD. Le journal Tomcat est disponible sur l'hôte à l'aide de 'docker logs containerid'.

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

0
Mark K.

d’abord, obtenez l’identifiant du conteneur souhaité en

docker ps

vous obtiendrez quelque chose comme ceci:

CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS                          PORTS                    NAMES
3ac548b6b315        frontend_react-web     "npm run start"     48 seconds ago      Up 47 seconds                   0.0.0.0:3000->3000/tcp   frontend_react-web_1

maintenant, copiez cet ID conteneur et lancez la commande suivante:

docker exec -it container_id sh

docker exec -it 3ac548b6b315 sh

0
Umesh