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 ?
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.
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
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 .
é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
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.
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
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.
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:
- 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
- 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
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 <container_name> bash
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 /
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
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 conteneurssont 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
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é.