Ich habe einen Container, in dem der Apache-Dienst im Vordergrund ausgeführt wird. Ich möchte in der Lage sein, von einer anderen Shell aus auf den Container zuzugreifen, um darin "herumzustöbern" und die Dateien zu untersuchen. Wenn ich mich an den Container anhänge, sehe ich mir momentan den Apache-Daemon an und kann keine Befehle ausführen.
Ist es möglich, einen anderen tty an einen laufenden Container anzuhängen? Möglicherweise kann ich die Tatsache ausnutzen, dass Docker tatsächlich nur LXC-Container umhüllt? Ich habe es versucht, sudo lxc-console -n [container-id] -t [1-4]
aber es scheint, dass nur ein tty verfügbar ist und dieser den Apache-Daemon ausführt. Vielleicht gibt es eine Möglichkeit, mehrere lxc-Konsolen während des Builds zu aktivieren?
Ich würde den Container lieber nicht mit einem openssh-Dienst konfigurieren und erstellen, wenn dies möglich ist.
docker attach [conainer-id]
?Antworten:
Mit Docker 1.3 gibt es einen neuen Befehl
docker exec
. Auf diese Weise können Sie einen laufenden Docker eingeben:quelle
exec
dies kein normales Terminal ist. Beispielsweise können Sie den Benutzer nicht einmal im Container ändern.su someuser
den Benutzer zu wechseln. Laufen Docker 1.4.1docker exec -it
ich irgendwann eine voll funktionsfähige Pseudo-Version bereitstellen werde, aber im Moment (Docker Version 1.9.1) gibt es einige Mängel: github.com/docker/docker/issues/8755Sie sollten das Tool 'nsenter' von Jérôme Petazzoni verwenden, um einen Container ohne SSH einzugeben. Siehe: https://github.com/jpetazzo/nsenter
Installieren Sie mit einfachem Ausführen:
docker run -v /usr/local/bin:/target jpetazzo/nsenter
Verwenden Sie dann den Befehl
docker-enter <container-id>
, um den Container einzugeben.quelle
docker exec
. Auf diese Weise können Sie einen laufenden Docker eingeben:docker exec -it <container-id> bash
(siehe meine Antwort unten)docker-enter
noch? Es gibt mircommand not found
.Aktualisieren
Ab Docker 0.9 muss die
/etc/default/docker
Datei mit der'-e lxc'
Startoption für den Docker-Daemon aktualisiert werden, bevor der Daemon neu gestartet wird, damit die folgenden Schritte jetzt funktionieren (ich habe dies durch einen Neustart des Hosts getan).Das ist alles, weil ...
Quelle
Bitte beachten Sie, dass dadurch verhindert wird, dass die optionale Netzwerkfunktion des neuen Hosts nur von Docker 0.11 "funktioniert" und nur die Loopback-Oberfläche angezeigt wird. Fehlerbericht
Es stellt sich heraus, dass die Lösung für eine andere Frage auch die Lösung für diese war:
Update: Sie müssen es bald verwenden,
ps --no-trunc
anstattps -notrunc
dass es veraltet ist.Suchen Sie die vollständige Container-ID
Geben Sie den Befehl lxc attach ein.
Oben wird mein Apache-Prozess angezeigt, auf dem der Docker gestartet wurde.
quelle
Erster Schritt Container-ID abrufen:
docker ps
Dies wird Ihnen so etwas zeigen
1170fe9e9460
ist in diesem Fall die Container-ID.Zweitens geben Sie den Docker ein:
docker exec -it [container_id] bash
also im obigen Fall:
docker exec -it 1170fe9e9460 bash
quelle
Was ist mit tmux / GNU Screen im Container? Scheint die reibungslosere Möglichkeit zu sein, mit einer einfachen Funktion auf so viele vty zuzugreifen, wie Sie möchten:
quelle
docker attach
und ich darauf hingewiesen habe, dass:...the attach command attaches to the running tty, not a new one, hence the question title is "...with new TTY"
nsenter
macht das. Ich musste jedoch auch auf einfache Weise einen Container eingeben, und nsenter reichte für meine Anforderungen nicht aus. Es war in einigen Fällen fehlerhaft (schwarzer Bildschirm plus -wd-Flagge funktionierte nicht). Außerdem wollte ich mich als bestimmter Benutzer und in einem bestimmten Verzeichnis anmelden.Am Ende habe ich mein eigenes Werkzeug zum Betreten von Containern hergestellt. Sie finden es unter: https://github.com/Pithikos/docker-enter
Die Verwendung ist so einfach wie
quelle
Der "nsinit" Weg ist:
installiere nsinit
aus dem Inneren des Behälters:
von außen:
benutze es
quelle
Bringt Sie zur Containerkonsole.
quelle
quelle
Ich habe Powershell auf einem laufenden Microsoft / Iis gestartet, das als Daemon ausgeführt wird
quelle
Unter Windows 10 habe ich Docker installiert. Ich führe Jnekins auf einem Container aus und habe dieselbe Fehlermeldung erhalten. Hier ist eine schrittweise Anleitung zur Behebung dieses Problems:
Schritt 1: Öffnen Sie gitbash und führen Sie Docker run -p 8080: 8080 -p 50000: 50000 jenkins aus.
Schritt 2: Öffnen Sie ein neues Terminal.
Schritt 3: Führen Sie "docker ps" aus, um eine Liste des laufenden Containers abzurufen. Kopieren Sie die Container-ID.
Schritt 4: Wenn Sie nun "docker exec -it {container id} sh" oder "docker exec -it {container id} bash" ausführen, wird eine ähnliche Fehlermeldung angezeigt wie "Das Eingabegerät ist kein TTY. Wenn ja Versuchen Sie mit mintty, dem Befehl 'winpty' voranzustellen. "
Schritt 5: Führen Sie den Befehl " $ winpty docker exec -it {container id} sh " aus.
vola !! Sie befinden sich jetzt im Terminal.
quelle