Ich bin neu in der Docker-Welt. Ich muss ein Shell-Skript aufrufen, das Befehlszeilenargumente über einen Docker-Container akzeptiert. Beispiel: Mein Shell-Skript sieht folgendermaßen aus:
#!bin/bash
echo $1
Dockerfile sieht folgendermaßen aus:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
Ich bin nicht sicher, wie ich die Argumente beim Ausführen des Containers übergeben soll
bash
shell
docker
command-line-arguments
Akash Mehta
quelle
quelle
docker run -ti test /file.sh abc
. Ich habe das Gefühl, dass das Skript nicht ausgeführt wird, weil es sein solltedocker run -ti test sh /file.sh abc
. sh oder / bin / sh wird es richtig ausführen.mit diesem Skript in
file.sh
und das
Dockerfile
du solltest in der Lage sein zu:
quelle
ENTRYPOINT ./file.sh
chmod +x file.sh
das Flag für ausführbare Dateien zu setzen.["/file.sh"]
und/file.sh
oder sogar[/file.sh]
Mit Docker können Umgebungsvariablen ordnungsgemäß über diese Art von Informationen übergeben werden.
Ändern Sie das Skript mit derselben Docker-Datei in
Verwenden Sie nach dem Erstellen den folgenden Docker-Befehl:
quelle
Hier interagieren einige Dinge:
docker run your_image arg1 arg2
ersetzt den Wert vonCMD
durcharg1 arg2
. Dies ist ein vollständiger Ersatz für das CMD, ohne dass weitere Werte daran angehängt werden. Aus diesem Grund wird häufigdocker run some_image /bin/bash
eine Bash-Shell im Container ausgeführt.Wenn Sie sowohl einen ENTRYPOINT- als auch einen CMD-Wert definiert haben, startet Docker den Container, indem es die beiden verkettet und diesen verketteten Befehl ausführt. Wenn Sie also Ihren Einstiegspunkt als definieren
file.sh
, können Sie den Container jetzt mit zusätzlichen Argumenten ausführen, die als Argumente an übergeben werdenfile.sh
.Einstiegspunkte und Befehle in Docker haben zwei Syntaxen, eine Zeichenfolgensyntax, mit der eine Shell gestartet wird, und eine JSON-Syntax, mit der eine Ausführung ausgeführt wird. Die Shell ist nützlich, um Dinge wie die E / A-Umleitung, das Verketten mehrerer Befehle (mit Dingen wie
&&
), das Ersetzen von Variablen usw. zu handhaben . Diese Shell behindert jedoch die Signalverarbeitung (wenn Sie jemals eine Verzögerung von 10 Sekunden zum Stoppen gesehen haben ein Container, dies ist oft die Ursache) und mit der Verkettung eines Einstiegspunkts und eines Befehls zusammen. Wenn Sie Ihren Einstiegspunkt als Zeichenfolge definieren, wird er ausgeführt/bin/sh -c "file.sh"
, was allein in Ordnung ist. Wenn Sie jedoch einen Befehl auch als Zeichenfolge definiert haben, wird/bin/sh -c "file.sh" /bin/sh -c "arg1 arg2"
der Befehl in Ihrem Container nicht so gut gestartet. In der Tabelle hier finden Sie weitere Informationen zur Interaktion dieser beiden OptionenDie Shell-
-c
Option akzeptiert nur ein einziges Argument. Alles danach würde bestanden werden als$1
,$2
usw., auf das einzelne Argument, aber nicht in einen eingebetteten Shell - Skript , wenn Sie explizit die Argumente übergeben. Dh/bin/sh -c "file.sh $1 $2" "arg1" "arg2"
würde funktionieren,/bin/sh -c "file.sh" "arg1" "arg2"
würde aber nicht dafile.sh
ohne Argumente aufgerufen werden.Alles in allem lautet das gemeinsame Design:
Und das führen Sie dann aus mit:
Es gibt einiges mehr Details dazu unter:
quelle
["bash", "--login", "-c"]
dass die Quelle / etc / profile im Bild angezeigt wird, fragte mich aber später, warum keine Argumente an ein Shell-Skript übergeben werden, das an Docker Run übergeben wird ... Ihre Antwort hat das geklärt, danke !Was ich habe, ist eine Skriptdatei, die tatsächlich Dinge ausführt. Diese Skriptdatei ist möglicherweise relativ kompliziert. Nennen wir es "run_container". Dieses Skript übernimmt Argumente aus der Befehlszeile:
Ein einfacher run_container könnte sein:
Was ich tun möchte, ist, nach dem "Andocken" dies in der Lage zu sein, diesen Container mit den Parametern in der Docker-Befehlszeile wie folgt zu starten:
und lassen Sie das Skript run_container mit p1 p2 p3 als Parametern ausführen.
Das ist meine Lösung:
Dockerfile:
quelle
ENTRYPOINT
Array durch Mittelwerte,"/run_container \"$@\""
die Leerzeichen enthalten, wird korrekt behandelt (zdocker run image_name foo 'bar baz' quux
. B. ).Wenn Sie es @build time ausführen möchten:
Wenn Sie es @run time ausführen möchten:
Dann in der Host-Shell
quelle
ENTRYPOINT
ist eine gute Antwort für das OP, von dem ich denke, dass es Laufzeit haben möchte, aber wenn Sie wirklich Zeitvariablen erstellen möchten, ist diese Antwort einfach kaputt. Verwenden SieARG
unddocker build --build-arg
docs.docker.com/engine/reference/builder/#argAndere Option...
Damit das funktioniert
in Dockerfile
in entrypoint.sh
quelle