Wie definiere ich eine Variable in einer Docker-Datei?

155

In meiner Docker-Datei möchte ich Variablen definieren, die ich später in der Docker-Datei verwenden kann .

Mir ist die ENVAnweisung bekannt, aber ich möchte nicht, dass diese Variablen Umgebungsvariablen sind.

Gibt es eine Möglichkeit , Variablen im Dockerfile-Bereich zu deklarieren ?

Maxime
quelle
10
Sie können ARG verwenden - siehe docs.docker.com/engine/reference/builder/#arg
lumos0815
@ lumos0815, ich denke, du solltest das als deine Antwort posten (obwohl es ein alter Post ist; für die Nachwelt), da OP genau darum bittet.
Schrei
ARG definiert keine Variable, die in der Docker-Datei verwendet werden kann. Sie müssten dies mit dem Befehl ENV verknüpfen, um das zu erhalten, wonach Sie suchen. ARG foo; ENV FOO = $ foo; COPY file $ foo (Entschuldigung für die schlechte Formatierung, ich denke, es ist nicht möglich, Codeblöcke und Mehrzeilen von einem Telefon aus zu machen)
ntwrkguru

Antworten:

111

Sie können verwenden ARG- siehe https://docs.docker.com/engine/reference/builder/#arg

Die ARGAnweisung definiert eine Variable, die Benutzer beim Erstellen mit dem docker buildBefehl unter Verwendung des --build-arg <varname>=<value>Flags 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.

lumos0815
quelle
@MargachChris sollte möglich sein, die Variablen für COPY
lumos0815
Es scheint nicht für den Befehl COPY zu funktionieren. docs.docker.com/engine/reference/builder/#arg
femibyte
54

Meines Wissens ENVerlaubt dies nur , wie unter " Umgebungsaustausch " erwähnt

Umgebungsvariablen (mit der ENVAnweisung deklariert ) können in bestimmten Anweisungen auch als Variablen verwendet werden, die von der Docker-Datei interpretiert werden.

Sie müssen Umgebungsvariablen sein, um in jedem neuen Container, der für jede Zeile der Docker-Datei von erstellt wurde, neu deklariert zu werden docker build.

Mit anderen Worten, diese Variablen werden nicht direkt in einer Docker-Datei interpretiert, sondern in einem Container, der für eine Docker-Datei erstellt wurde, daher die Verwendung von Umgebungsvariablen.


An diesem Tag verwende ich sowohl ARG( Docker 1.10+ unddocker build --build-arg var=value ) als auch ENV.
Mit ARGallein bedeutet , dass Ihre Variable bei der Erstellung sichtbar ist, nicht zur Laufzeit.

Meine Docker-Datei hat normalerweise:

ARG var
ENV var=${var}

In Ihrem Fall ARGist es genug: Ich verwende es normalerweise zum Festlegen der Variablen http_proxy, die der Docker-Build benötigt, um zur Build-Zeit auf das Internet zuzugreifen.

VonC
quelle
50

Zur Beantwortung Ihrer Frage:

In meiner Docker-Datei möchte ich Variablen definieren, die ich später in der Docker-Datei verwenden kann.

Sie können eine Variable definieren mit:

ARG myvalue=3

Leerzeichen um das gleiche Zeichen sind nicht zulässig.

Und verwenden Sie es später mit:

RUN echo $myvalue > /test
Ortomala Lokni
quelle
13

Wenn die Variable innerhalb derselben RUNAnweisung wiederverwendet wird , kann einfach eine Shell-Variable festgelegt werden. Mir gefällt sehr, wie sie dies mit der offiziellen Ruby Dockerfile angegangen sind .

Evgeny Chernyavskiy
quelle
Gute Antwort. Wenn möglich, sollten Sie ARG verwenden. Manchmal müssen Sie jedoch eine dynamische Variable zuweisen und wiederverwenden. Beispiel:RUN foo=$(date) && echo $foo
wisbucky
3

Sie können ARG variable defaultValuediesen Wert verwenden und während des Ausführungsbefehls sogar mit aktualisieren --build-arg variable=value. Um diese Variablen in der Docker-Datei zu verwenden, können Sie sie wie $variableim Befehl run referenzieren .

Hinweis: Diese Variablen sind für Linux-Befehle wie verfügbar RUN echo $variableund bleiben im Image nicht erhalten.

user2719152
quelle