2016-06-22 15 views
5

Ich habe einen Shell-Skript, script.sh, das einige Zeilen in eine Datei schreibt:Schreiben von Daten in Dockerfile Datei

#!/usr/bin/env bash 
printf "blah 
blah 
blah 
blah\n" | sudo tee file.txt 

Jetzt in meinem Dockerfile, füge ich dieses Skript und führen Sie es, dann versuchen, fügen Sie die erzeugte file.txt:

ADD script.sh . 
RUN chmod 755 script.sh && ./script.sh 
ADD file.txt . 

Wenn ich die oben tun, bekomme ich nur ein Fehler an den ADD file.txt . Befehl verweisen:

Warum kann docker die Datei nicht finden, die mein Shell-Skript generiert? Wo könnte ich es finden?

Antwort

4

Wenn Sie RUN chmod 755 script.sh && ./script.sh es dieses Skript tatsächlich ausführen innerhalb die Docker Behälter (zB: in der Docker Schicht).

Wenn Sie ADD file.txt . versuchen, fügen Sie eine Datei auf Ihrem lokalen Dateisystem im Andock-Container hinzu (dh in einer neuen Docker-Ebene).

Sie können das nicht tun, weil die Datei.txt auf Ihrem Computer nicht existiert.

In der Tat haben Sie bereits diese Datei in Docker, versuchen docker run --rm -ti mydockerimage cat file.txt und Sie sollten es Inhalt sehen angezeigt

+0

Yup ich erkannte, dass nach der Tat. – pcsram

1

Das liegt daran, dass Docker den gesamten Kontext des Verzeichnisses (in dem sich Ihre Docker-Datei befindet) zu Beginn des Docker-Daemon lädt. Von Docker docs,

Der Build wird vom Docker-Daemon läuft, nicht von der CLI. Das erste, was ein Build-Prozess tut, ist den gesamten Kontext (rekursiv) an den Daemon zu senden. In den meisten Fällen empfiehlt es sich, mit einem leeren Verzeichnis als Kontext zu beginnen und die Docker-Datei in diesem Verzeichnis zu behalten. Fügen Sie nur die Dateien hinzu, die zum Erstellen der Dockerdatei benötigt werden.

Da Ihre Textdatei am Anfang nicht verfügbar war, erhalten Sie diese Fehlermeldung. Wenn Sie weiterhin möchten, dass diese Textdatei zum Docker-Image hinzugefügt werden soll, können Sie den Befehl `docker build 'aus derselben Skriptdatei aufrufen. Ändern Sie script.sh,

#!/usr/bin/env bash 
printf "blah 
blah 
blah 
blah\n" | sudo tee <docker-file-directory>/file.txt 
docker build --tag yourtag <docker-file-directory> 

Und ändern Sie Ihre Dockerfile, nur um die generierte Textdatei hinzuzufügen.

ADD file.txt 
.. <rest of the Dockerfile instructions> 
+1

Ich denke, die ausgegebene Datei tatsächlich in der Schicht Docker Bild selbst sein kann. Ich denke, das kann der Fall sein, weil ich die 'ADD file.txt' Zeile entfernt habe und sie durch' CMD ["cat", "file.txt"] 'ersetzt habe. Ich war in der Lage, das Bild zu bauen und den Container richtig laufen, mit der Anzeige "bla bla bla .." – pcsram