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
Durch Ausführen dieser Skriptdatei wird der Container in einer neu aufgerufenen Bash ausgeführt.
Jetzt muss ich eine Skriptdatei (test.sh) ausführen, die sich bereits im Container des oben angegebenen Shell-Skripts befindet (z. B. cd /path/to/test.sh && ./test.sh). Wie geht das?
WORKDIR
und verwendenCMD
?Antworten:
Sie können einen Befehl in einem laufenden Container ausführen, indem Sie
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
:docker exec mycontainer /path/to/test.sh
Und um von einer Bash-Sitzung wegzulaufen:
docker exec -it mycontainer /bin/bash
Von dort aus können Sie Ihr Skript ausführen.
quelle
docker exec -i mycontainer bash < mylocal.sh
Dadurch wird das lokale Hostskript gelesen und im Container ausgeführt. Sie können dies mit anderen Dingen tun (wie .tgz-Dateien, die in tar geleitet werden) - es wird nur das '-i' verwendet, um in die std-Eingabe des Containerprozesses zu leiten.Get-Content mylocal.sh | docker exec -i mycontainer bash
. Ich weiß aber nicht, ob das funktioniert.Angenommen, Ihr Docker-Container ist aktiv, können Sie Befehle wie folgt ausführen:
docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"
quelle
/bin/sh -c "cmd1; cmd2; ...; cmdn"
) als Wert einer Shell-Variablen übergeben können? Ich frage, weil 'Docker Run' eher einen einzelnen Befehl und einzelne nicht zitierte Argumente als eine Zeichenfolge in Anführungszeichen zu erwarten scheint.cmd1
muss ich eine ganze for-Schleife übergeben - aber es erwartet;
nach der Schleifenanweisung und der do- Anweisung. Wie kann ich die gesamte for-Schleife als einen einzigen Befehl ausführen, dhcmd1
? Ist es möglich?Ich suchte nach einer Antwort auf dieselbe Frage und fand ENTRYPOINT in der Dockerfile- Lösung für mich.
Dockerfile
Jetzt werden die Skripte ausgeführt, wenn ich den Container starte, und ich erhalte die Bash-Eingabeaufforderung, nachdem die Skripte ausgeführt wurden.
quelle
Sie können auch ein lokales Verzeichnis in Ihr Docker-Image einbinden und das Skript in Ihrem
.bashrc
. 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 auftreten. Ich öffne einfach eine neue Shell. (Das erneute Öffnen einer Shell wurde vermieden - siehe Update-Hinweis)
So binden Sie Ihr aktuelles Verzeichnis:
docker run -it -v $PWD:/scripts $my_docker_build /bin/bash
Jetzt ist Ihr aktuelles Verzeichnis an
/scripts
Ihre Docker-Instanz gebunden .(Veraltet) Um Ihre
.bashrc
Änderungen zu speichern , schreiben Sie Ihr Arbeitsimage mit folgendem Befehl fest:docker commit $container_id $my_docker_build
Aktualisieren
Um das Problem zu lösen und für jede Änderung eine neue Shell zu öffnen, gehe ich jetzt wie folgt vor:
In der Docker-Datei selbst füge ich hinzu
RUN echo "/scripts/bashrc" > /root/.bashrc"
. Innerhalbzshrc
exportiere ich das Skriptverzeichnis in den Pfad. Das Skriptverzeichnis enthält jetzt mehrere Dateien anstelle einer. Jetzt kann ich alle Skripte direkt aufrufen, ohne bei jeder Änderung eine Sub-Shell öffnen zu müssen.Übrigens können Sie die Verlaufsdatei auch außerhalb Ihres Containers definieren. Auf diese Weise ist es nicht mehr erforderlich, eine Bash-Änderung vorzunehmen.
quelle
Falls Sie keinen laufenden Container möchten (oder haben), können Sie Ihr Skript direkt mit dem
run
Befehl aufrufen .Entfernen Sie die iterativen tty-
-i -t
Argumente und verwenden Sie Folgendes :Dies funktioniert (nicht getestet) auch für andere Skripte:
quelle
Schauen Sie sich auch die Einstiegspunkte an. Sie können mehrere CMD https://docs.docker.com/engine/reference/builder/#/entrypoint verwenden
quelle
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
quelle