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'obtiens 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 le shell bash dans un conteneur en cours d'exécution (par exemple à des fins de diagnostic)
dois-je y exécuter un serveur SSH et me connecter via ssh?
docker run CONTAINER
est prévu en 1.0docker attach container_name
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 le devez vraiment et que vous êtes dans un environnement de débogage, vous pouvez le faire:
sudo lxc-attach -n <ID>
Notez que l'id doit être le plein (docker ps -notrunc
).Cependant, je déconseille fortement cela.
avis:
-notrunc
est obsolète, il sera remplacé par--no-trunc
bientôt.la source
lxc-attach
devrait très bien fonctionner. J'ai juste vérifié deux fois et cela fonctionne pour moi. (Notez qu'il ne fonctionnera pas avec le noyau antérieur à la version 3.8).docker -d -e lxc
docker run -v /var/log/nginx -name somename imagename command
; 2) exécuter un autre récipient pour afficher le contenu du volume de données:docker run -volumes-from somename -i -t busybox /bin/sh
.Avec docker 1.3, il y a une nouvelle commande
docker exec
. Cela vous permet d'entrer un docker en cours d'exécution:la source
docker ps
pour obtenir l'identifiant des instances en cours d'exécutiondocker inspect <image>
pour voir quel shell est disponible. Par exemple, courez à ladocker exec -it <container id> /bin/sh
place.Fais juste
Comme mentionné dans les commentaires, pour vous détacher du conteneur sans l'arrêter, tapez Ctrlpalors Ctrlq.
la source
docker attach container_name
utilisezctrl p
etctrl q
au lieu deexit
.exit
commande arrête le conteneur, où au furctrlp
etctrl q
à mesure détache ce conteneur et le maintient en marcheÉtant donné que les choses changent, à l'heure actuelle, 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 référentiel github . Mais en général, vous pouvez utiliser nsenter comme ceci:
ou vous pouvez utiliser le wrapper
docker-enter
:Une belle explication sur le sujet peut être trouvée sur l'entrée de blog de Jérôme Petazzoni: Pourquoi vous n'avez pas besoin d'exécuter sshd dans vos conteneurs Docker
la source
source /proc/*/environ
.La première chose que vous ne pouvez pas exécuter
Parce que cette commande attend une image et non un conteneur et qu'elle entraînerait 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 devons nous pousser à penser différemment (donc vous devriez trouver des moyens pour que vous n'ayez pas besoin de vous connecter au conteneur), mais je le trouve toujours utile et c'est ainsi que je travaille autour de.
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 ceci:Ce qu'il fait, c'est qu'il vous permet de «vous attacher» au conteneur et d'être présenté avec l'
supervisorctl
interface pour arrêter / démarrer / redémarrer et vérifier les journaux. Si cela ne suffit pas, vous pouvezCtrl+D
et vous tomberez dans un shell qui vous permettra d'avoir un aperçu 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 le conteneur sans coque, alors prenez toutes les mesures nécessaires pour sécuriser votre conteneur.
la source
Gardez un œil sur cette demande de tirage: https://github.com/docker/docker/pull/7409
Qui implémente l'
docker exec <container_id> <command>
utilitaire à venir . Lorsque cela est disponible, il devrait être possible, par exemple, de démarrer et d'arrêter le service ssh à l'intérieur d'un conteneur en cours d'exécution.Il faut également
nsinit
procéder comme suit : "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 à exécuter. https://gist.github.com/ubergarm/ed42ebbea293350c30a6la source
docker exec
atterri dans Docker 1.3, il est donc désormais possible de créer et de rejoindre une nouvelle session shell dans un conteneur en cours d'exécutionVous pouvez utiliser
la source
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: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" au-dessus de l'image de production avec tous les outils nécessaires, y compris cette astuce d'écran.
la source
voici ma solution
partie de DOckerfile:
partie de "initd.sh"
une fois l'image créée, vous avez deux options en utilisant exec et attach:
docker run --name $ CONTAINER_NAME -dt $ IMAGE_NAME
puis
docker exec -it $ CONTAINER_NAME / bin / bash
et utilise
CTRL + D à détacher
docker run --name $ CONTAINER_NAME -dit $ IMAGE_NAME
puis
docker attacher $ CONTAINER_NAME
et utilise
CTRL + P et CTRL + Q à détacher
la différence entre les options est dans le paramètre -i
la source
Il y a deux façons.
Avec attache
Avec exec
la source
Si l'objectif est de vérifier les journaux de l'application, ce message montre le démarrage de Tomcat et la queue du journal dans le cadre 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/
la source
Il est utile d'attribuer un nom lors de l'exécution du conteneur. Vous n'avez pas besoin de référencer container_id.
docker run --name container_name yourimage docker exec -it container_name bash
la source
tout d'abord, obtenez l'ID de conteneur du conteneur souhaité en
vous obtiendrez quelque chose comme ceci:
Copiez maintenant cet ID de conteneur et exécutez la commande suivante:
la source
Peut-être que vous avez été induit en erreur comme moi en pensant en termes de VM lors du développement de conteneurs. Mon conseil: essayez de ne pas le faire.
Les conteneurs sont comme tout autre processus. En effet, vous voudrez peut-être les "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 dehors de celui-ci en partageant les répertoires, en écrivant sur stdout (pour que les journaux de docker fonctionnent) ou quelque chose comme ça.
À des fins de débogage, vous souhaiterez peut-être 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 le rattacher en utilisant:
Si vous souhaitez déboguer le conteneur parce qu'il fait quelque chose que vous ne pensiez pas qu'il fasse, essayez de le déboguer: /server/596994/how-can-i-debug-a-docker-container -initialisation
la source
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 la nécessité.la source