Ich habe einen Container mit erstellt, -d
damit er nicht interaktiv ist.
docker run -d shykes/pybuilder bin/bash
Ich sehe, dass der Container verlassen hat:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6c45e8cc5f0 shykes/pybuilder:latest "bin/bash" 41 minutes ago Exited (0) 2 seconds ago clever_bardeen
Jetzt möchte ich gelegentlich Befehle auf der Maschine ausführen und beenden. Nur um die Antwort zu bekommen.
Ich habe versucht, die Maschine zu starten. Ich habe versucht, zu befestigen. Ich dachte, ich könnte run
mit einem Container anrufen , aber das scheint nicht erlaubt zu sein. Die Verwendung start
scheint nur zu laufen und dann schnell zu existieren.
Ich möchte nach dem Beenden wieder in den interaktiven Modus zurückkehren.
Ich habe es versucht:
docker attach d6c45e8cc5f0
Aber ich verstehe:
2014/10/01 22:33:34 You cannot attach to a stopped container, start it first
Aber wenn ich es starte, wird es trotzdem beendet. Fang 22. Ich kann nicht gewinnen.
docker container ls -a
Antworten:
Im Oktober 2014 führte das Docker-Team den
docker exec
Befehl ein : https://docs.docker.com/engine/reference/commandline/exec/Jetzt können Sie jeden Befehl in einem laufenden Container ausführen, ohne dessen ID (oder Namen) zu kennen:
Beachten Sie, dass der
exec
Befehl nur für bereits ausgeführte Container funktioniert. Wenn der Container derzeit gestoppt ist, müssen Sie ihn zuerst mit dem folgenden Befehl ausführen:Das Wichtigste dabei ist die
-d
Option, für die stehtdetached
. Dies bedeutet, dass der Befehl, den Sie ursprünglich für container (/bin/bash
) angegeben haben, im Hintergrund ausgeführt wird und der Container nicht sofort gestoppt wird .quelle
CDR LDN
zucdrev
für die Antwort unten ( stackoverflow.com/a/26181666/149428 ).-it
?Ihr Container wird verlassen wie der Befehl Sie es gab enden wird. Verwenden Sie die folgenden Optionen, um es am Leben zu erhalten:
-i
Halten Sie STDIN offen, auch wenn es nicht angebracht ist.-t
Ordnen Sie eine Pseudo-TTY zu.Ihr neuer
run
Befehl lautet also:Wenn Sie an einen bereits laufenden Container anhängen möchten:
In diesen Beispielen
/bin/bash
wird als Befehl verwendet.quelle
docker exec -it CONTAINER_ID /bin/bash -c "export VAR=1 && echo $VAR"
und gedruckte leere Variable (erwartet1
). Was vermisse ich?-it
ist das nicht verfügbar.Daher denke ich, dass die Antwort einfacher ist als viele irreführende Antworten oben.
So starten Sie einen vorhandenen Container, der gestoppt ist
So stoppen Sie einen laufenden Container
Dann melden Sie sich bei der interaktiven Shell eines Containers an
So starten Sie einen vorhandenen Container und hängen ihn mit einem Befehl an
Achtung, dies stoppt den Container beim Verlassen. Im Allgemeinen müssen Sie den Container jedoch starten, anbringen und stoppen, nachdem Sie fertig sind.
quelle
Um die Antwort von katrmr zu erweitern, müssen
commit
Sie ein Bild erstellen, wenn der Container gestoppt ist und aufgrund eines Fehlers nicht gestartet werden kann. Dann können Sie Bash im neuen Image starten:quelle
dshell
, um es in einer Vielzahl von Situationen automatisch zu tun - github.com/avirshup/docker-cli-sugarEinige der Antworten hier sind irreführend, da sie Container betreffen, die ausgeführt und nicht gestoppt werden.
Sven Dowideit erklärte im Docker-Forum, dass Container an ihren Prozess gebunden sind (und Docker den Prozess eines gestoppten Containers nicht ändern kann, was anscheinend zumindest auf seine interne Struktur zurückzuführen ist: https://github.com/docker/docker/issues / 1437 ). Grundsätzlich besteht die einzige Option darin,
commit
den Container auf ein Bild undrun
einen anderen Befehl zu setzen.Siehe https://forums.docker.com/t/run-command-in-stopped-container/343
(Ich glaube, der
ENTRYPOINT
Ansatz " mit Argumenten" würde auch nicht funktionieren, da Sie das immer noch nicht ändern können Argumente für einen gestoppten Container.)quelle
bin/bash
ohne-it
ausführen, ändert sich nichts am Container. Daher ist das Festschreiben nicht unbedingt erforderlich, und CDR LDN gibt die richtige Antwort für die jeweilige Situation des OP. Dennochcommit
ist die Antwort auf das technische Problem, wie der Containerprozess geändert werden kann.Ich musste bash -c verwenden, um meinen Befehl auszuführen:
docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"
quelle
Erstellen eines Containers und Senden von Befehlen nacheinander:
quelle
Dies ist eine kombinierte Antwort, die ich mit der obigen CDR-LDN-Antwort und der hier gefundenen Antwort zusammengestellt habe .
Im folgenden Beispiel wird ein Arch Linux-Container von einem Image aus gestartet und anschließend
git
mit dempacman
Tool auf diesem Container installiert :Das ist alles.
quelle
Wenn Sie versuchen, ein Shell-Skript auszuführen, müssen Sie es als Bash ausführen.
quelle
Leiten Sie einen Befehl an stdin
Muss das entfernen,
-t
damit es funktioniert:Dies kann praktischer sein als manchmal die Verwendung von CLI-Optionen.
Getestet mit:
dann auf einer anderen Shell:
Dann auf der ersten Schale:
Getestet auf Docker 1.13.1, Ubuntu 16.04 Host.
quelle
Angenommen, das Image verwendet den Standardeinstiegspunkt
/bin/sh -c
, wird die Ausführung/bin/bash
sofort im Daemon-Modus (-d
) beendet. Wenn dieser Container eine interaktive Shell ausführen soll, verwenden Sie-it
anstelle von-d
. Wenn Sie beliebige Befehle in einem Container ausführen möchten, der normalerweise einen anderen Prozess ausführt, möchten Sie möglicherweise versuchen,nsenter
odernsinit
. Weitere Informationen finden Sie unter https://blog.codecentric.de/de/2014/07/enter-docker-container/ .quelle
Leider ist es unmöglich,
ENTRYPOINT
mit Argumenten zu überschreibendocker run --entrypoint
, um dieses Ziel zu erreichen.quelle
Ich möchte darauf hinweisen, dass die Top-Antwort etwas irreführend ist.
Das Problem bei der Ausführung
docker run
ist, dass jedes Mal ein neuer Container erstellt wird. Es gibt jedoch Fälle, in denen wir alte Container erneut besuchen oder mit neuen Containern keinen Platz beanspruchen möchten.(Gegeben
clever_bardeen
ist der Name des erstellten Containers ...)Stellen Sie im Fall von OP sicher, dass das Docker-Image zuerst ausgeführt wird, indem Sie den folgenden Befehl ausführen:
Führen Sie dann den Docker-Container mit dem folgenden Befehl aus:
quelle
Für Mac:
Wenn Sie als Root-Benutzer eine Verbindung herstellen möchten:
quelle
Einfache Antwort: gleichzeitig starten und anhängen. In diesem Fall tun Sie genau das, wonach Sie gefragt haben.
Stellen Sie sicher, dass Sie sich ändern
<CONTAINER_ID/CONTAINER_NAME>
quelle
Ex:
quelle
Ich führe einen Windows-Container aus und muss im Docker-Container nach Dateien und Ordnern suchen, die erstellt und kopiert wurden.
Zu diesem Zweck habe ich den folgenden Docker-Einstiegspunktbefehl verwendet, um die Eingabeaufforderung im Container auszuführen oder an den Container anzuhängen.
Das hat mir geholfen, sowohl an die Eingabeaufforderung an den Container anzuhängen als auch den Container am Leben zu erhalten. :) :)
quelle
Eine schnelle Möglichkeit, den zuletzt verlassenen Container fortzusetzen und darauf zuzugreifen:
quelle
Ich benutze normalerweise Folgendes:
kontinuierlich mit einem laufenden Container zu interagieren.
quelle