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.

25voto

velop Punkte 2809

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"

19voto

langlauf.io Punkte 2797

Ein Container erstellen und Befehle nacheinander senden:

docker create --name=my_new_container -it ubuntu
docker start my_new_container
// ps -a sagt 'Up X Sekunden'
docker exec my_new_container /pfad/zu/meinem/befehl
// ps -a sagt immer noch 'Up X+Y Sekunden'
docker exec my_new_container /pfad/zu/weiterem/befehl

11voto

MrKulli Punkte 719

Wenn Sie versuchen, ein Shell-Skript auszuführen, müssen Sie es als Bash ausführen.

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

9voto

Leiten Sie einen Befehl an docker exec bash stdin weiter

Muss das -t entfernen, damit es funktioniert:

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

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

Getestet mit:

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

dann in einer anderen Shell:

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

Dann in der ersten Shell:

ls -l myfile

Getestet mit Docker 1.13.1, Ubuntu 16.04 Host.

8voto

imriss Punkte 1565

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

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

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.

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