Docker führen <IMAGE> <MULTIPLE COMMANDS> aus

255

Ich versuche, MULTIPLE-Befehle wie diesen auszuführen.

docker run image cd /path/to/somewhere && python a.py

Dies gibt mir jedoch den Fehler "Keine solche Datei oder kein solches Verzeichnis", da es als ...

"docker run image cd /path/to/somewhere" && "python a.py"

Es scheint, dass einige ESCAPE-Zeichen wie "" oder () benötigt werden.

Also habe ich es auch versucht

docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)

aber diese haben nicht funktioniert.

Ich habe nach Docker Run Reference gesucht, aber keine Hinweise zu ESCAPE-Zeichen gefunden.

ai0307
quelle

Antworten:

440

Verwenden Sie /bin/bash -cund Semikolon, um mehrere Befehle im Docker auszuführen;

docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"

Wenn wir Befehl2 (Python) benötigen, wird genau dann ausgeführt, wenn Befehl1 (CD) den Exit-Status Null (kein Fehler) zurückgegeben hat. Verwenden Sie &&stattdessen anstelle von;

docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"
anhlc
quelle
Vielen Dank für Ihren Hinweis! Ich habe einfach versucht [Docker Run Image "cd / bin; ls"] und habe folgende Fehlermeldungen erhalten. [exec: "cd / bin; ls": stat cd / bin; ls: keine solche Datei oder kein solches Verzeichnis] ​​[Fehlerantwort vom Dämon: Container kann nicht gestartet werden]
ai0307
1
Jeder, der diese Antwort findet, könnte daran interessiert sein, wie er hier Dokumente verwendet, um Befehle in einen Container einzugeben: Hier ist meine Antwort auf eine andere Frage wie diese zu diesen Dokumenten. Schauen Sie sich diese an .
Kohányi Róbert
14
docker run alpine sh -c "ls | wc >> xxx"Das hilft mir sehr, wenn Bash nicht verfügbar ist.
Eddy Hernandez
1
Dies funktioniert für, cdaber nicht für Dinge, bei denen Rückkehrcodes ;nicht dasselbe sind wie &&unter unix.stackexchange.com/questions/37069/…
Nick Zalutskiy,
1
Danke @NickZalutskiy, aktualisierte Antwort mit Ihrem Kommentar
anhlc
31

Sie können dies auf verschiedene Arten tun:

  1. Verwenden Sie die Option -w, um das Arbeitsverzeichnis zu ändern:

    -w, --workdir = "" Arbeitsverzeichnis im Container

    https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w

  2. Übergeben Sie das gesamte Argument an / bin / bash:

    docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
    
John Petrone
quelle
Keine Erwähnung --workdirim angegebenen Link. Die Seite wurde wahrscheinlich verschoben / geändert. Könnte auf docs.docker.com/engine/reference/run/#workdir oder docs.docker.com/engine/reference/commandline/run
marcv
10

Sie können Befehle auch im Docker-Container weiterleiten, bash -c "<command1> | <command2>"z. B.:

docker run img /bin/bash -c "ls -1 | wc -l"

Ohne Aufrufen der Shell in der Fernbedienung wird die Ausgabe jedoch an das lokale Terminal umgeleitet.

USER_1
quelle
3

Wenn Sie das Ergebnis in einer Datei außerhalb des Containers auf Ihrem lokalen Computer speichern möchten, können Sie Folgendes tun.

RES_FILE=$(readlink -f /tmp/result.txt)

docker run --rm -v ${RES_FILE}:/result.txt img bash -c "cat /etc/passwd | grep root > /result.txt"

Das Ergebnis Ihrer Befehle ist /tmp/result.txtauf Ihrem lokalen Computer verfügbar .

Flamarion
quelle
2

Für alle anderen, die hierher gekommen sind, um dasselbe mit docker-composeIhnen zu tun, müssen Sie nur bash -cmehrere Befehle voranstellen und in Anführungszeichen setzen, die mit verbunden sind &&.

Also im OP-Beispiel docker-compose run image bash -c "cd /path/to/somewhere && python a.py"

S ..
quelle
Dieser hat für mich funktioniert, aber der Docker-Prozess wird beendet, nachdem der Befehl ausgeführt wurde
node_man
und wie beende ich einen solchen Docker-Prozess? Das Drücken von Strg C oder Strg Z oder das Eingeben von exit funktioniert nicht oder muss ich es mit dem Docker-Stopp-Befehl beenden?
Node_man
funktioniert docker-compose down [service-name]nicht oder? (und keine Sorge, Sie sind willkommen, helfen gerne :))
S ..
2

Nur um eine richtige Antwort aus dem Kommentar von @Eddy Hernandez zu geben, und das ist sehr richtig, da Alpine mit Asche kommt, nicht mit Bash.

Die Frage bezieht sich nun auf das Starten einer Shell im Docker Alpine-Container, was die Verwendung von shoder ashoder /bin/shoder impliziert /bin/ash/.

Basierend auf der Frage des OP:

docker run image sh -c "cd /path/to/somewhere && python a.py"

Nqsir
quelle
1

bash -cfunktioniert gut, wenn die von Ihnen ausgeführten Befehle relativ einfach sind. Wenn Sie jedoch versuchen, eine lange Reihe von Befehlen mit Steuerzeichen auszuführen, kann dies komplex werden.

Ich habe dies erfolgreich umgangen, indem ich meine Befehle von außen in den Prozess geleitet habe, d. H.

cat script.sh | docker run -i <image> /bin/bash

user2966041
quelle