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.
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.
Wenn Ihr Docker-Container betriebsbereit ist, können Sie die folgenden Befehle ausführen:
docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"
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.
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
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.
Schauen Sie sich auch die Einstiegspunkte an. Sie können mehrere CMD-Dateien verwenden https://docs.docker.com/engine/reference/builder/#/entrypoint
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