631 Stimmen

Wie führe ich einen Befehl auf einem bereits vorhandenen Docker-Container aus?

Ich habe einen Container mit -d erstellt, damit er nicht interaktiv ist.

docker run -d shykes/pybuilder bin/bash

Ich sehe, dass der Container beendet wurde:

CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                      PORTS               NAMES
d6c45e8cc5f0        shykes/pybuilder:latest   "bin/bash"          41 Minuten zuvor     Beendet (0) vor 2 Sekunden                       clever_bardeen

Jetzt möchte ich gelegentliche Befehle auf der Maschine ausführen und dann beenden. Nur um die Antwort zu erhalten.

Ich habe versucht, die Maschine zu starten. Ich habe versucht, sie anzuhängen. Ich dachte, ich könnte run mit einem Container aufrufen, aber das scheint nicht erlaubt zu sein. Mit start scheint es nur schnell zu laufen und dann zu beenden.

Nach dem Beenden möchte ich wieder in den interaktiven Modus zurückkehren.

Ich habe versucht:

docker attach d6c45e8cc5f0

Aber ich erhalte:

2014/10/01 22:33:34 Sie können sich nicht an einen gestoppten Container anhängen, starten Sie ihn zuerst

Aber wenn ich ihn starte, beendet er sich sowieso. Catch 22. Ich kann nicht gewinnen.

645voto

Scadge Punkte 8963

Im Oktober 2014 hat das Docker-Team den Befehl docker exec eingeführt: https://docs.docker.com/engine/reference/commandline/exec/

Jetzt können Sie also jeden Befehl in einem laufenden Container ausführen, wenn Sie nur dessen ID (oder Namen) kennen:

docker exec -it  echo "Hallo vom Container!"

Beachten Sie, dass der exec-Befehl nur auf einem bereits laufenden Container funktioniert. Wenn der Container derzeit gestoppt ist, müssen Sie ihn zuerst mit dem folgenden Befehl ausführen:

docker run -it -d shykes/pybuilder /bin/bash

Das Wichtigste hier ist die Option -d, die für detached steht. Das bedeutet, dass der Befehl, den Sie ursprünglich dem Container bereitgestellt haben (/bin/bash), im Hintergrund ausgeführt wird und der Container nicht sofort gestoppt wird.

313voto

cdrev Punkte 5414

Ihr Container wird beendet, da der von Ihnen eingegebene Befehl endet. Verwenden Sie die folgenden Optionen, um ihn am Leben zu halten:

  • -i Halten Sie STDIN offen, auch wenn nicht angehängt.
  • -t Weisen Sie ein Pseudo-TTY zu.

Ihr neuer run Befehl lautet also:

docker run -it -d shykes/pybuilder bin/bash

Wenn Sie sich an einen bereits laufenden Container anhängen möchten:

docker exec -it CONTAINER_ID /bin/bash

In diesen Beispielen wird /bin/bash als Befehl verwendet.

219voto

Peter T. Punkte 7860

Also ich denke, die Antwort ist einfacher als viele irreführende Antworten oben.

Um einen vorhandenen Container zu starten, der gestoppt ist

docker start 

Um einen laufenden Container zu stoppen

docker stop 

Dann um sich bei der interaktiven Shell eines Containers anzumelden

docker exec -it  bash

Um einen vorhandenen Container zu starten und sich gleichzeitig anzuhängen

docker start -ai 

Vorsicht, dies wird den Container beim Verlassen stoppen. Aber im Allgemeinen müssen Sie den Container starten, anhängen und ihn nach Abschluss stoppen.

108voto

Aaron V Punkte 6053

Um katrmr's Antwort zu erweitern, wenn der Container gestoppt ist und aufgrund eines Fehlers nicht gestartet werden kann, müssen Sie ihn in ein Bild commit. Dann können Sie Bash im neuen Bild starten:

docker commit [CONTAINER_ID] temporary_image
docker run --entrypoint=bash -it temporary_image

43voto

katrmr Punkte 568

Einige der Antworten hier sind irreführend, da sie Container betreffen, die laufen, nicht gestoppt sind.

Sven Dowideit erklärte im Docker-Forum, dass Container an ihren Prozess gebunden sind (und Docker den Prozess eines gestoppten Containers nicht ändern kann, anscheinend aufgrund seiner internen Struktur: https://github.com/docker/docker/issues/1437). Also ist im Grunde die einzige Option, den Container in ein Image zu commiten und ihn mit einem anderen Befehl auszuführen.

Siehe https://forums.docker.com/t/run-command-in-stopped-container/343
(Ich glaube, der Ansatz mit "ENTRYPOINT mit Argumenten" würde auch nicht funktionieren, da Sie immer noch nicht die Argumente eines gestoppten Containers ändern könnten.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X