2016-04-11 8 views
2

Ich frage mich, ob eine env-Variable in einem Docker verwendet werden kann? Grund dafür ist die Kontrolle der Markierung. Zum Beispiel, sagen, dass ich diese Zeile in meinem Dockerfile haben:Kann eine Variable im Andockfenster FROM verwendet werden?

From myApp 

Was ich will, ist dies:

From myApp:${VERSION} 

So kann ich docker build . myApp --build-arg VERSION=9

Der Prozess sagen kann Docker Bilder für diese bauen App ist das gleiche. Ich möchte keine Dockerfiles haben, die fast identisch sind, nur um ein anderes Basis-Image zu verwenden. Wenn ich Version 9 erstellen möchte, sollte Version 9 des Basis-Images verwendet werden.

Antwort

0

Es ist nicht möglich.

Sie können jedoch ein Variablen-Tag wie from myApp:latest verwenden und das Tag latest überschreiben, wenn Sie eine neue Version erstellen.

+0

Aber mit diesem Ansatz Wie baue ich eine ältere Version? Wenn ich die Version 8 neu erstellen möchte, wird sie die neueste Version als Basis verwenden, was bedeutet, dass Version 9 nicht als Basis verwendet wird? Ich möchte nur einen einfachen Mechanismus, um Bild und Basisbild synchronisiert zu halten. – CodyK

+0

Ich kann verstehen, dass Sie alle Arten von Versionen und Kombinationen pflegen und unterstützen möchten. Dies wird leicht unrealistisch, wenn man mit einem "nicht abwärtskompatiblen" Merkmal innerhalb seiner Bilder konfrontiert wird, z. neue Programmparameter. Der oben erwähnte Vorlagenmechanismus ist derzeit der beste, um damit umzugehen. Mein Rat ist, die Versionen in Ihren Umgebungen unter allen Umständen immer zu minimieren und eine Branch-per-Not-Down-Compatble-Version zu verwenden. Konzentrieren Sie sich nur darauf, die Bilder der neuesten Version zu verbessern und die Komplexität der Versionen und Zweige in Grenzen zu halten. – blacklabelops

+0

Dieser spezielle Anwendungsfall wird aus vom Anbieter bereitgestellten Docker-Dateien erstellt. Wir werden die Dockerfiles überhaupt nicht ändern, aber angesichts der Art ihrer Architektur ist dies erforderlich. Ihre Bilder sind nicht auf Docker Hub. Also, was Sie tun müssen, ist die neue Version (ihres Werkzeugs) zu installieren und ein Skript auszuführen, um die Bilder zu erstellen. Dann verwenden Sie diese Bilder als Basisbilder. Danke für den Ratschlag. Ich werde daran denken. – CodyK

2

Sie könnten Ihre Dockerfile einfach aus einer Vorlage generieren. Setzen Sie etwa wie folgt in einem Makefile:

MYTAG=latest 

.PHONY: Dockerfile 
Dockerfile: Dockerfile.in 
    sed 's/MYTAG/$(MYTAG)/' $< > [email protected] || rm -f [email protected] 

Dann können Sie laufen:

make MYTAG=8; docker build -t my-app-8 . 

Das würde nur Sinn machen, wenn Sie häufig Bilder erstellen, die erfordern einen anderen Tag in der FROM Linie.

+0

Ich dachte darüber nach. Ich habe nur auf eine native Docker-Funktion gehofft. – CodyK

+1

Es gibt keine native Lösung; Es gibt jedoch eine offene Vorschlags-/Funktionsanfrage. https://github.com/docker/docker/issues/18119 – thaJeztah

0

Leider ist das nicht möglich. Die erste Zeile Ihrer Dockerfile muss eine FROM Richtlinie sein, so dass die Verwendung der ARG Richtlinie ausgeschlossen ist. Es gibt eine gute Antwort gibt von larsks über einen Dockerfile zu erzeugen, aber ich würde auch nur verschiedene Dockerfiles Schaffung gerne vorschlagen und dann einen bestimmten in Ihrem docker build Befehl unter Angabe mit dem -f Schalter:

docker build -t codemiester/app:latest -f ./Dockerfile.apache2.ubuntu 
+0

kann ich das tun. Es ist nur ein Schmerz, gegeben, wie ich erwähnt habe, ist der Prozess unabhängig von den Versionen gleich. Und ich möchte auch einen einfachen Mechanismus, um Bild und Basisbild synchronisiert zu halten. – CodyK

Verwandte Themen