webentwicklung-frage-antwort-db.com.de

Ausführen eines Skripts in einem Docker-Container mithilfe von Shell-Skript

Ich bin neu in der Docker-Technologie. Ich versuche, ein Shell-Skript zum Einrichten eines Docker-Containers zu erstellen. Meine Skriptdatei sieht folgendermaßen aus 

#!bin/bash

docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash

Beim Ausführen dieser Skriptdatei wird der Container in einer neu aufgerufenen Bash ausgeführt.

Nun muss ich eine Skriptdatei (test.sh) ausführen, die sich bereits im Container befindet, und zwar aus dem oben angegebenen Shell-Skript (z Bitte fragen Sie, ob das Szenario nicht klar ist.

53
zappy

Sie können einen Befehl in einem laufenden Container mit docker exec [OPTIONS] CONTAINER COMMAND [ARG...] ausführen:

docker exec mycontainer /path/to/test.sh

Und von einer bash-Sitzung laufen:

docker exec -it mycontainer /bin/bash

Und von dort können Sie Ihr Skript oder was auch immer ausführen. 

74

Wenn Ihr Docker-Container betriebsbereit ist, können Sie die folgenden Befehle ausführen:

docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"
72
Cyclops

Ich suchte eine Antwort auf diese Frage und fand ENTRYPOINT in Dockerfile-Lösung für mich.

Dockerfile

...
ENTRYPOINT /my-script.sh ; /my-script2.sh ; /bin/bash

Jetzt werden die Skripts ausgeführt, wenn ich den Container starte, und ich bekomme die Bash-Eingabeaufforderung, nachdem die Skripts ausgeführt wurden.

9
tojo

Sie können auch ein lokales Verzeichnis in Ihr Docker-Image einbinden und das Skript in Ihren .bashrc einbinden. Vergessen Sie nicht, dass das Skript aus Funktionen bestehen muss, es sei denn, Sie möchten, dass es auf jeder neuen Shell ausgeführt wird. (Dies ist veraltet, siehe Update-Hinweis.)

Ich verwende diese Lösung, um das Skript außerhalb der Docker-Instanz aktualisieren zu können. Auf diese Weise muss ich das Bild nicht erneut ausführen, wenn Änderungen vorgenommen werden. Ich öffne einfach eine neue Shell. (Die Shell wurde erneut geöffnet - siehe Update-Hinweis)

So binden Sie Ihr aktuelles Verzeichnis:

docker run -it -v $PWD:/scripts $my_docker_build /bin/bash

Ihr aktuelles Verzeichnis ist jetzt an /scripts Ihrer Docker-Instanz gebunden.

(Veraltet) Um Ihre .bashrc-Änderungen zu speichern, bestätigen Sie Ihr Arbeitsabbild mit diesem Befehl:

docker commit $container_id $my_docker_build

Aktualisieren

Um das Problem zu lösen und eine neue Shell für jede Änderung zu öffnen, mache ich jetzt Folgendes:

In der Docker-Datei selbst füge ich RUN echo "/scripts/bashrc" > /root/.bashrc" hinzu. Innerhalb von zshrc exportiere ich das Skriptverzeichnis in den Pfad. Das Skriptverzeichnis enthält jetzt mehrere Dateien anstelle von einer. Jetzt kann ich alle Skripts direkt aufrufen, ohne bei jeder Änderung eine Unter-Shell öffnen zu müssen.

Übrigens können Sie die History-Datei auch außerhalb Ihres Containers definieren. Auf diese Weise ist es nicht mehr notwendig, eine Änderung der Bash vorzunehmen.

3
Devpool

Schauen Sie sich auch die Einstiegspunkte an. Sie können mehrere CMD-Dateien verwenden https://docs.docker.com/engine/reference/builder/#/entrypoint

1
Boris

Wenn Sie denselben Befehl auf mehreren Instanzen ausführen möchten, können Sie Folgendes tun:

for i in c1 dm1 dm2 ds1 ds2 gtm_m gtm_sl; do docker exec -it $i /bin/bash -c "service sshd start"; done
0
DMin