So übergeben Sie eine Datei als Argument für eine Docker-Datei

8

Eigentlich bin ich mir nicht sicher, ob das möglich ist, aber ich weiß, dass es immer einen Hack gibt, also bin ich begeistert davon, was Ihre Experten dazu sagen werden.

Ich möchte beim Erstellen meines Docker-Images ein Paket als Argument übergeben, damit ich separate App-Versionen mit derselben Docker-Datei bereitstellen kann.

Dies ist ein Beispiel für das, was ich erreichen möchte:
Die Fähigkeit, ein Paket als Argument beim Erstellen des Bildes zu übergeben (ich weiß, dass die Syntax falsch ist, es ist nur ein Beispiel)

 docker build -t myapp/myapp:v1 . package_myapp_v1.tar  

Verwenden Sie dann ADDin der Dockerfile, um es in den Behälter zu extrahieren.

ADD passed_package ./ 

Wenn ich also ein Image für die Version 2 meiner App erstellen möchte, kann ich einfach das neue Paket im docker buildBefehl angeben, ohne das zu ändern Dockerfile.

Weiß jemand, was der Trick ist, um das zum Laufen zu bringen?

Vielen Dank :)

Sturm
quelle

Antworten:

10

Ich habe es geschafft, dies nach zwei Minuten Lesen in Dockers Dokument zu lösen .

Die ARG-Anweisung definiert eine Variable, die Benutzer beim Erstellen mit dem Docker-Build-Befehl mithilfe des Flags --build-arg = an den Builder übergeben können. Wenn ein Benutzer ein Build-Argument angibt, das nicht in der Docker-Datei definiert wurde, gibt der Build einen Fehler aus.

Also habe ich das benutzt, um mein Image aufzubauen

docker build -t myapp/v1 --build-arg package=package_myapp_v1.tar.gz .

Um das Paket zu erhalten, Dockerfileverwenden Sie die folgenden ARGAnweisungen:

ARG package
ADD $package ./

Der Inhalt der $packageVariablen wird package_myapp_v1.tar.gzdurch das Tag geleitet package.

Sturm
quelle
1

Es scheint, als ob sich der Kontext zwischen den Builds ändern sollte, nicht zwischen der Docker-Datei, oder? In beiden Fällen besteht eine Möglichkeit, dies zu erreichen, darin, die Fähigkeit von Docker zu nutzen, den Kontext als tar-Datei (optional gz) mit der Docker-Datei im Stammverzeichnis zu empfangen:

tar --create \
    /some/path/to/Dockerfile \
    /other/path/to/package-X.Y.Z.tgz \
    --transform 's,.*/,,' \
    --transform 's/package.*tgz/package.tgz/' |
docker build -t myapp/myapp:v1 -

Hinweis:

  • Die erste transformOption glättet die Verzeichnisstruktur, sodass alle Dateien im Stammverzeichnis der tarDatei angezeigt werden, wo Docker sie erwartet.

  • Mit der zweiten transformOption wird die Versionsnummer aus der Paketdatei entfernt, sodass Sie die ADD package.tgz .Zeile in Ihrer Docker- Datei nicht bearbeiten müssen.

Matei David
quelle