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.
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.
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.
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
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
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.)
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"
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
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.
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
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).
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.
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
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. :)
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
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.
# docker exec -d container_id command
Ex:
# docker exec -d xcdefrdtt service jira stop