Führen Sie ein Skript in Dockerfile aus


88

Ich versuche, während meines Erstellungsprozesses ein Skript in meiner Docker-Datei 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 auch bu meinen laufenden Container ausführen:

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

Nichts scheint zu funktionieren.

Weißt du, wie man es macht?


Ist bootstarp.shdas ausführbare Bit gesetzt?
Jwodder

So RUN chmod + x /bootstarp.sh?
Kevin

2
Was genau passiert mit "funktioniert nicht"? Zeigt es einen Fehler? Ist die Datei im Bild vorhanden? Wenn Sie sich docker exec -it symfony bashim Container befinden, können Sie das Skript manuell ausführen und dessen Inhalt überprüfen? ( cat bootstarp.sh)?
ThaJeztah

Versuchen Sie dies: docker exec symfony /bin/bash /bootstarp.shund lassen Sie mich die Ausgabe wissen.
Boynux

11
Ermahgerd Bootstarp!
Bruno Bronosky

Antworten:


122

RUNund ENTRYPOINTsind zwei verschiedene Möglichkeiten, ein Skript auszuführen.

RUNbedeutet, dass ein Zwischencontainer erstellt, das Skript ausgeführt und der neue Status dieses Containers in einem neuen Zwischenabbild eingefroren wird. Das Skript wird danach nicht mehr ausgeführt: Ihr endgültiges Bild 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 a RUN chmod +x /bootstrap.shist eine gute Idee.

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

In Anbetracht Ihres Skripts ( KevinRaimbaud/docker-symfony/docker/php/bootstarp.sh: einige git config --globalBefehle) ist es am besten, dieses Skript einmal in Ihrer Docker-Datei auszuführen, aber stellen Sie sicher, dass Sie den richtigen Benutzer verwenden (die globale Git-Konfigurationsdatei lautet% HOME% /. Gitconfig, was standardmäßig der Fall ist die / root one)

Zu Ihrer Docker-Datei hinzufügen :

RUN /bootstart.sh

Überprüfen Sie dann beim Ausführen eines Containers den Inhalt von, /root/.gitconfigum sicherzustellen, dass das Skript ausgeführt wurde.


5
Vielleicht haben Sie auch gemeint bootstrap.shstatt bootstarp.sh: siehe stackoverflow.com/a/1254561/6309
VonC

Cool! Funktioniert sehr gut mit RUN /bootstrap.sh
Kevin

1
Der Shebang in der ersten Zeile hat es für mich getan, danke! :)
GDICommander

30

Zusätzlich zu den obigen Antworten:

Wenn Sie Ihre .sh-Skriptdatei unter Windows erstellt / bearbeitet haben, stellen Sie sicher, dass sie mit einer 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. Linux erzeugt also die Fehlermeldung, als ob es keinen 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 empfehlen, das Plugin " End Of Line " zu installieren . Anschließend können Sie Zeilenenden sichtbar machen, indem Sie Strg-R, Strg-W drücken. Zum Festlegen von Endungen im Linux-Stil können Sie Strg-R, Strg-L drücken. Drücken Sie im Windows-Stil Strg-R, Strg-C.

4
Wow, du hast meinen Tag gerettet. Danke dafür.
MW

2
Brillant! Das war mein genaues Problem!
Kevinsyel

1
Mein VSCode hatte die linierten Endungen eines Shell-Skripts in Windows automatisch auf CRLF gesetzt. Der Docker-Build schlug aufgrund einiger zufälliger Zeichen fehl. Ich habe die Einstellungen in VS Code geändert und es begann sofort zu funktionieren. Vielen Dank! Ich habe gestimmt.
Adithya Upadhya

24

Versuchen Sie, ein Skript mit zu erstellen ADD Befehl und der Spezifikation des Arbeitsverzeichnisses ("Skript" ist der Name des Skripts und /root/script.shdort, wo Sie es im Container haben möchten, kann es einen anderen Pfad geben:

ADD script.sh /root/script.sh

In diesem Fall ADDmuss es vorher kommen CMD, wenn Sie eine BTW haben, ist es eine coole Möglichkeit, Skripte von einem Host-Computer an einen beliebigen Ort im Container zu importieren

An CMDOrt und Stelle[./script]

Es sollte Ihr Skript automatisch ausführen

Sie können auch festlegen , WORKDIRwie /root, you'l dann automatisch in Stamm platziert wird, auf einen Behälter Start


Wie erkennt Docker, wo sich script.sh zuerst befindet? Ich meine, der erste Parameter,script.sh
Sonnenuntergänge

Da Sie Container bauen, sind Sie auch für das Platzieren von Pfaden verantwortlich
Michael

Der Pfad und der Name des ersten Parameters beziehen script.shsich auf denDockerfile
eja

1

Es wird empfohlen, diese COPYOption nicht ADDbeim Kopieren aus dem lokalen Dateisystem in das Image zu verwenden. Außerdem würde ich empfehlen, einen Unterordner zu erstellen, in dem Sie Ihre Inhalte ablegen können. Wenn nichts anderes, hält es die Dinge aufgeräumt. Stellen Sie sicher, dass Sie das Skript mit als ausführbar markierenchmod .

Hier erstelle ich einen scriptsUnterordner , in dem ich mein Skript ablegen und ausführen kann:

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.