Ich hatte naiv erwartet, dass dieser Befehl eine Bash-Shell in einem laufenden Container ausführt:
docker run "id of running container" /bin/bash
es sieht so aus, als wäre es nicht möglich, ich bekomme den Fehler:
2013/07/27 20:00:24 Internal server error: 404 trying to fetch remote history for 27d757283842
Also, wenn ich die Bash-Shell in einem laufenden Container ausführen möchte (z. B. zu Diagnosezwecken)
Muss ich einen SSH-Server darin ausführen und mich über ssh anmelden?
docker run CONTAINER
ist geplant in 1.0docker attach container_name
Antworten:
EDIT: Jetzt können Sie
docker exec -it "id of running container" bash
( doc ) verwendenZuvor war die Antwort auf diese Frage:
Wenn Sie wirklich müssen und sich in einer Debug-Umgebung befinden, können Sie dies tun:
sudo lxc-attach -n <ID>
Beachten Sie, dass die ID die vollständige sein muss (docker ps -notrunc
).Ich empfehle jedoch dringend dagegen.
Hinweis:
-notrunc
ist veraltet, wird--no-trunc
bald ersetzt.quelle
lxc-attach
sollte einwandfrei funktionieren. Ich habe gerade doppelt geprüft und es funktioniert für mich. (Beachten Sie, dass es mit Kernel vor 3.8 nicht funktioniert).docker -d -e lxc
docker run -v /var/log/nginx -name somename imagename command
; 2) Führen Sie einen anderen Container aus, um den Inhalt des Datenvolumens anzuzeigen :docker run -volumes-from somename -i -t busybox /bin/sh
.Mit Docker 1.3 gibt es einen neuen Befehl
docker exec
. Auf diese Weise können Sie einen laufenden Docker eingeben:quelle
docker ps
, um ID der laufenden Instanzen zu erhaltendocker inspect <image>
diese Option, um zu sehen, welche Shell verfügbar ist. ZBdocker exec -it <container id> /bin/sh
stattdessen laufen .Mach einfach
Wie in den Kommentaren erwähnt, aus dem Behälter zu lösen , ohne sie zu stoppen, geben Sie Ctrlpdann Ctrlq.
quelle
docker attach container_name
verwendetctrl p
undctrl q
stattexit
.exit
Befehl stoppt den Container, wo alsctrlp
undctrl q
nur diesen Container abtrennt und ihn am Laufen hältDa sich die Dinge ändern, wird derzeit die empfohlene Art des Zugriffs auf einen laufenden Container verwendet
nsenter
.Weitere Informationen zu diesem Github-Repository finden Sie . Im Allgemeinen können Sie nsenter jedoch folgendermaßen verwenden:
oder Sie können den Wrapper verwenden
docker-enter
:Eine nette Erklärung zu diesem Thema finden Sie in Jérôme Petazzonis Blogeintrag: Warum Sie sshd nicht in Ihren Docker-Containern ausführen müssen
quelle
source /proc/*/environ
.Als erstes kannst du nicht rennen
Da dieser Befehl ein Bild und keinen Container erwartet und ohnehin dazu führen würde, dass ein neuer Container erzeugt wird (also nicht der, den Sie sich ansehen wollten).
Ich stimme der Tatsache zu, dass wir uns mit Docker dazu drängen sollten, anders zu denken (also sollten Sie Wege finden, damit Sie sich nicht in den Container einloggen müssen), aber ich finde es trotzdem nützlich und so arbeite ich um es herum.
Ich führe meine Befehle über den Supervisor im DEAMON-Modus aus.
Dann führe ich das aus, was ich nenne.
docker_loop.sh
Der Inhalt ist so ziemlich das Folgende:Es ermöglicht Ihnen, eine Verbindung zum Container
supervisorctl
herzustellen und die Schnittstelle zum Stoppen / Starten / Neustarten und Überprüfen von Protokollen anzuzeigen. Wenn das nicht ausreichen sollte, können SieCtrl+D
und Sie werden in eine Shell fallen, die es Ihnen ermöglicht, einen Blick darauf zu werfen, als wäre es ein normales System.BITTE BEACHTEN SIE AUCH, dass dieses System nicht so sicher ist wie der Behälter ohne Hülle. Führen Sie daher alle erforderlichen Schritte aus, um Ihren Behälter zu sichern.
quelle
Behalten Sie diese Pull-Anfrage im Auge: https://github.com/docker/docker/pull/7409
Welches implementiert das bevorstehende
docker exec <container_id> <command>
Dienstprogramm. Wenn dies verfügbar ist, sollte es möglich sein, z. B. den SSH-Dienst in einem laufenden Container zu starten und zu stoppen.Dazu gibt es auch Folgendes
nsinit
: "nsinit bietet eine praktische Möglichkeit, auf eine Shell im Namespace eines laufenden Containers zuzugreifen" , aber es scheint schwierig zu sein, sie zum Laufen zu bringen. https://gist.github.com/ubergarm/ed42ebbea293350c30a6quelle
docker exec
gelandet in Docker 1.3, so ist es jetzt möglich, eine neue Shell-Sitzung in einem laufenden Container zu erstellen und daran teilzunehmenSie können verwenden
quelle
Es gibt tatsächlich eine Möglichkeit, eine Shell im Container zu haben.
Angenommen, Sie
/root/run.sh
starten den Prozess, den Prozessmanager (Supervisor) oder was auch immer.Erstellen Sie
/root/runme.sh
mit einigen Gnu-Screen-Tricks:Jetzt haben Sie Ihre Daemons in Tab 0 und eine interaktive Shell in Tab 1. Sie können
docker attach
jederzeit sehen, was im Container passiert.Ein weiterer Rat ist, mit allen erforderlichen Tools, einschließlich dieses Bildschirmtricks, ein "Entwicklungspaket" -Bild über dem Produktionsabbild zu erstellen.
quelle
Hier ist meine Lösung
Teil von DOckerfile:
Teil von "initd.sh"
Nachdem das Image erstellt wurde, haben Sie zwei Optionen mit exec und attach:
Docker-Lauf --name $ CONTAINER_NAME -dt $ IMAGE_NAME
dann
docker exec -it $ CONTAINER_NAME / bin / bash
und verwenden
STRG + D zum Abnehmen
Docker-Lauf --name $ CONTAINER_NAME -dit $ IMAGE_NAME
dann
Docker hängen $ CONTAINER_NAME an
und verwenden
STRG + P und STRG + Q zum Lösen
Der Unterschied zwischen den Optionen liegt im Parameter -i
quelle
Es gibt zwei Möglichkeiten.
Mit anhängen
Mit exec
quelle
Wenn das Ziel darin besteht, die Protokolle der Anwendung zu überprüfen, wird in diesem Beitrag gezeigt, wie Tomcat gestartet und das Protokoll als Teil von CMD verfolgt wird. Das Tomcat-Protokoll ist auf dem Host mithilfe der Docker-Protokoll-Container-ID verfügbar.
http://blog.trifork.com/2013/08/15/using-docker-to-efficiently-create-multiple-tomcat-instances/
quelle
Es ist nützlich, beim Ausführen eines Containers einen Namen zuzuweisen. Sie brauchen keine refer container_id.
docker run --name container_name yourimage docker exec -it container_name bash
quelle
Holen Sie sich zunächst die Container-ID des gewünschten Containers von
Sie werden so etwas bekommen:
Kopieren Sie nun diese Container-ID und führen Sie den folgenden Befehl aus:
quelle
Vielleicht wurden Sie wie ich in die Irre geführt, bei der Entwicklung von Containern in VMs zu denken. Mein Rat: Versuchen Sie es nicht.
Container sind wie jeder andere Prozess. In der Tat möchten Sie sie möglicherweise zu Debugging-Zwecken "anhängen" (denken Sie an / proc // env oder strace -p), aber das ist ein ganz besonderer Fall.
Normalerweise "führen" Sie den Prozess einfach aus. Wenn Sie also die Konfiguration ändern oder die Protokolle lesen möchten, erstellen Sie einfach einen neuen Container und stellen Sie sicher, dass Sie die Protokolle außerhalb des Containers schreiben, indem Sie Verzeichnisse freigeben und in stdout schreiben (damit Docker-Protokolle funktionieren). oder etwas ähnliches.
Zum Debuggen möchten Sie möglicherweise eine Shell und dann Ihren Code starten und dann STRG-p + STRG-q drücken, um die Shell intakt zu lassen. Auf diese Weise können Sie wieder anbringen mit:
Wenn Sie den Container debuggen möchten, weil er etwas tut, das Sie nicht erwartet haben, versuchen Sie, ihn zu debuggen: /server/596994/how-can-i-debug-a-docker-container -Initialisierung
quelle
Nein das ist nicht möglich. Verwenden Sie so etwas wie
supervisord
einen SSH-Server, wenn dies erforderlich ist. Obwohl ich definitiv die Notwendigkeit in Frage stelle.quelle