wake-up-neo.net

Wie führe ich einen Befehl für einen 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 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 verbinden. Ich dachte, ich könnte run mit einem Container aufrufen, aber das scheint nicht erlaubt zu sein. Die Verwendung von start scheint einfach zu funktionieren und ist dann schnell vorhanden.

Ich möchte nach dem Beenden wieder in den interaktiven Modus wechseln.

Ich habe es versucht:

docker attach d6c45e8cc5f0

Aber ich bekomme:

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.

372
Johnston

Im Oktober 2014 führte das Docker-Team den docker exec-Befehl ein : https://docs.docker.com/engine/reference/commandline/exec/

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

docker exec -it <container_id_or_name> echo "Hello from container!"

Beachten Sie, dass der Befehl exec nur bei bereits ausgeführtem 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 ist hier die Option -d, die für detached steht. Das bedeutet, dass der Befehl, den Sie ursprünglich für den Container (/bin/bash) bereitgestellt haben, im Hintergrund ausgeführt wird und der Container nicht sofort anhalten ist.

439
Scadge

Ihr Container wird exit so wie der Befehl beendet, den Sie gegeben haben, enden. Verwenden Sie die folgenden Optionen, um es live zu halten:

  • -i Halten Sie STDIN offen, auch wenn es nicht angehängt ist.
  • -t Ein Pseudo-TTY zuordnen.

Ihr neuer run Befehl lautet also:

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

Wenn Sie sich an einen bereits laufenden Container anschließen möchten:

docker exec -it CONTAINER_ID /bin/bash

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

265
cdrev

Um die Antwort von katrmr zu erweitern: Wenn der Container angehalten wird und aufgrund eines Fehlers nicht gestartet werden kann, müssen Sie commit in ein Bild einfügen. Dann können Sie bash im neuen Image starten:

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

Ich denke, die Antwort ist einfach als viele irreführende Antworten oben.

So starten Sie einen vorhandenen Container, der gestoppt ist

docker start <container-name/ID>

Um einen laufenden Container zu stoppen

docker stop <container-name/ID>

Dann um sich bei der interaktiven Shell eines Containers anzumelden

docker exec -it <container-name/ID> bash
74
Peter T.

Einige der Antworten sind irreführend, da sie Container betreffen, die ausgeführt werden und nicht angehalten werden.

Sven Dowideit erklärte im Docker-Forum, dass Container an ihren Prozess gebunden sind (und Docker kann den Prozess eines angehaltenen Containers nicht ändern, zumindest aufgrund seiner internen Struktur: https://github.com/docker/docker)/Ausgaben/1437 ). Im Grunde ist die einzige Option, commit den Container zu einem Image und run mit einem anderen Befehl.

Siehe https://forums.docker.com/t/run-command-in-stopped-container/343
(Ich glaube, dass der Ansatz "ENTRYPOINT with arguments" auch nicht funktioniert, da Sie die Argumente immer noch nicht in einen gestoppten Container ändern können.)

38
katrmr

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"

16
velop

Einen Container erstellen und nacheinander Befehle senden:

docker create --name=my_new_container -it ubuntu
docker start my_new_container
// ps -a says 'Up X seconds'
docker exec my_new_container /path/to/my/command
// ps -a still says 'Up X+Y seconds'
docker exec my_new_container /path/to/another/command
13

Dies ist eine kombinierte Antwort, die ich mithilfe der obigen CDR-LDN-Antwort und der Antwort, die ich gefunden habe, erstellt habe hier .

Das folgende Beispiel startet einen Arch Linux-Container von einem Image und installiert dann git in diesem Container mit dem Tool pacman:

Sudo docker run -it -d archlinux /bin/bash
Sudo docker ps -l
Sudo docker exec -it [container_ID] script /dev/null -c "pacman -S git --noconfirm"

Das ist alles.

7
imriss

Pipe einen Befehl an stdin

Muss -t entfernen, damit es funktioniert:

echo 'touch myfile' | Sudo docker exec -i CONTAINER_NAME bash

Dies kann praktischer sein als die Verwendung von CLI-Optionen.

Getestet mit:

Sudo docker run --name ub16 -it ubuntu:16.04 bash

dann auf einer anderen Shell:

echo 'touch myfile' | Sudo docker exec -i ub16 bash

Dann zuerst auf Shell:

ls -l myfile

auf Docker 1.13.1, Ubuntu 16.04 Host.

Wenn Sie versuchen, ein Shell-Skript auszuführen, müssen Sie es als Bash ausführen (basierend auf Antwort von velop).

docker exec -it containerid bash -c /path/to/your/script.sh
2
MrKulli

Leider ist es nicht möglich, ENTRYPOINT mit Argumenten mit docker run --entrypoint zu überschreiben, um dieses Ziel zu erreichen.

Hinweis: Sie können die ENTRYPOINT-Einstellung mit --entrypoint überschreiben, aber Dies kann nur die Binärdatei auf exec setzen (es wird kein sh -c verwendet).

2
wieczorek1990

Wenn das Bild den Standardeingangspunkt /bin/sh -c verwendet, wird die Ausführung von /bin/bash sofort im Dämonmodus (-d) beendet. Wenn Sie möchten, dass dieser Container eine interaktive Shell ausführt, verwenden Sie -it anstelle von -d. Wenn Sie willkürliche Befehle in einem Container ausführen möchten, der normalerweise einen anderen Prozess ausführt, können Sie nsenter oder nsinit versuchen. Schauen Sie unter https://blog.codecentric.de/de/2014/07/enter-docker-container/ nach den Details.

2
Andreas Steffan

Ich habe dies für meinen knotenroten Container gemacht und mein Problem gelöst:

NODEREDNAME=mynodered
# Create a new node red container
docker run -it -p 1880:1880 -v "$(pwd)/data":/data --name $NODEREDNAME -d nodered/node-red-docker

# Open a Shell in the container (THAT ANSWERS THE QUESTION)
docker exec -it $NODEREDNAME bash -c "cd /data & npm install node-red-node-mongodb"

# Restart the container to load the new nodes
docker stop $NODEREDNAME
docker start $NODEREDNAME
1
Ângelo Polotto

Ich verwende Windows-Container und muss in den Docker-Container nach Dateien und Ordnern suchen, die erstellt und kopiert wurden.

Zu diesem Zweck habe ich den folgenden Befehl verwendet, um den Befehl Eingabeaufforderung innerhalb des Containers auszuführen oder an den Container anzuhängen.

ENTRYPOINT ["C:\\Windows\\System32\\cmd.exe", "-D", "FOREGROUND"]

Das hat mir geholfen, sowohl den Befehl Prompt an Container anhängen als auch den Container live zu halten. :)

0
Jenish Rabadiya

Für Mac:

$ docker exec -it <container-name> sh

wenn Sie sich als root-Benutzer anmelden möchten:

$ docker exec -u 0 -it <container-name> sh
0
Lyncean Patel

Einfache Antwort: Starten und gleichzeitig anhängen. In diesem Fall machen Sie genau das, wonach Sie gefragt haben.

docker start <CONTAINER_ID/CONTAINER_NAME> && docker attach <CONTAINER_ID/CONTAINER_NAME> 

stellen Sie sicher, dass Sie <CONTAINER_ID/CONTAINER_NAME> ändern.

0
user353305
# docker exec -d container_id command 

Ex:

# docker exec -d xcdefrdtt service jira stop 
0
Rajesh Gurram