webentwicklung-frage-antwort-db.com.de

Führen Sie ein Skript in Dockerfile aus

Ich versuche, während des Erstellungsprozesses in meiner Docker-Datei ein Skript auszuführen. Aber es scheint nicht zu funktionieren.

Ich habe es so versucht:

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

Auch so:

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

Und ich führe auch meinen laufenden Container aus:

docker exec symfony /bin/bash -c "/bootstrap.sh"

Nichts scheint zu funktionieren.

Weißt du, wie man es macht?

63
Kevin

RUN und ENTRYPOINT sind zwei verschiedene Methoden zum Ausführen eines Skripts.

RUN bedeutet, dass ein Zwischencontainer erstellt wird, das Skript ausgeführt wird und der neue Status dieses Containers in einem neuen Zwischenimage eingefroren wird. Das Skript wird danach nicht mehr ausgeführt: Ihr endgültiges Image soll das Ergebnis dieses Skripts widerspiegeln.

ENTRYPOINT bedeutet, dass Ihr Image (das das Skript noch nicht ausgeführt hat) einen Container erstellt und dieses Skript ausführt.

In beiden Fällen muss das Skript hinzugefügt werden und ein RUN chmod +x /bootstrap.sh ist eine gute Idee.

Es sollte auch mit einem Shebang beginnen (wie #!/bin/sh)

Betrachten Sie Ihr Skript ( KevinRaimbaud/docker-symfony/docker/php/bootstarp.sh : ein paar git config --global -Befehle), es ist am besten, das Skript einmal in Ihrer Docker-Datei auszuführen, aber darauf zu achten, dass der richtige Benutzer verwendet wird (die globale Konfigurationsdatei für Git ist% HOME% /. gitconfig, die standardmäßig die Datei/root ist).

Add to Ihre Dockerfile :

RUN /bootstart.sh

Überprüfen Sie dann beim Ausführen eines Containers den Inhalt von /root/.gitconfig, um zu bestätigen, dass das Skript ausgeführt wurde.

81
VonC

Versuchen Sie, ein Skript mit dem Befehl ADD und der Angabe des Arbeitsverzeichnisses zu erstellen. So ("script" ist der Name des Skripts und /root/script.sh ist die Stelle, an der Sie es im Container haben möchten. Es kann sich um einen anderen Pfad handeln :

ADD script.sh /root/script.sh

In diesem Fall muss ADD vor CMD stehen. Wenn Sie übrigens eine haben, ist es eine gute Möglichkeit, Skripte von einem Host-Computer an einen beliebigen Ort im Container zu importieren

In CMD Platz [./script]

Es sollte automatisch Ihr Skript ausführen

Sie können auch WORKDIR als /root angeben, dann werden Sie beim Starten eines Containers automatisch in root abgelegt

23
Michael

Zusätzlich zu den obigen Antworten:

Wenn Sie Ihre .sh-Skriptdatei in Windows erstellt/bearbeitet haben, vergewissern Sie sich, dass sie mit einem Zeilenende im Unix-Format gespeichert wurde . Standardmäßig konvertieren viele Editoren in Windows Unix-Zeilenenden in das Windows-Format, und Linux erkennt Shebang (#!/Bin/sh) am Anfang der Datei nicht. So wird Linux die Fehlermeldung erzeugen, als ob es kein Shebang gibt.

Tipps:

  • Wenn Sie Notepad ++ verwenden, müssen Sie auf "Bearbeiten/EOL-Konvertierung/UNIX (LF)" klicken.
  • Wenn Sie Visual Studio verwenden, würde ich vorschlagen, das Plugin " End Of Line " zu installieren. Anschließend können Sie die Zeilenenden durch Drücken von Strg-R, Strg-W sichtbar machen. Und um Linux-Endungen festzulegen, drücken Sie Strg-R, Strg-L. Drücken Sie im Windows-Stil Strg-R, Strg-C.
10
VeganHunter