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?
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.
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
_
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.
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
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.
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
Vous pouvez utiliser
docker exec -it <container_name> bash
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
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.
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:
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
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
Il y a deux façons.
Avec attache
$ Sudo docker attach 665b4a1e17b6 #by ID
Avec exec
$ Sudo docker exec - -t 665b4a1e17b6 #by ID
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/
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