405 Stimmen

Holen Sie sich den Wert der Umgebungsvariable in der Dockerfile

Ich baue einen Container für eine Ruby-App. Die Konfiguration meiner App ist in Umgebungsvariablen enthalten (die innerhalb der App mit dotenv geladen werden).

Eine dieser Konfigurationsvariablen ist die öffentliche IP der App, die intern verwendet wird, um Links zu erstellen. Ich muss einen dnsmasq-Eintrag hinzufügen, der diese IP auf 127.0.0.1 im Container zeigt, damit er die Links der App abrufen kann, als ob er nicht containerisiert wäre.

Ich versuche also, ein ENV in meiner Dockerdatei festzulegen, das eine Umgebungsvariable an den Container übergibt.

Ich habe ein paar Dinge ausprobiert.

ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`

Alles überträgt jedoch den String "REQUEST_DOMAIN" anstelle des Werts der Umgebungsvariable. Gibt es eine Möglichkeit, Werte von Umgebungsvariablen vom Hostrechner an den Container zu übergeben?

7voto

snassr Punkte 1108

Wenn Sie alle Umgebungsvariablen ($BeispielEnvVar) in einem Dockerfile suchen und ersetzen möchten, dann würden Sie wie folgt vorgehen:

envsubst < /pfad/zum/Dockerfile | docker build -t myDockerImage . -f -

5voto

goulashsoup Punkte 2285

Bei Verwendung von build-arg...

docker build --build-arg CODE_VERSION=1.2 Dockerfile

... beachten Sie, dass die Variable nach FROM nicht verfügbar ist:

ARG  CODE_VERSION=latest
FROM base:${CODE_VERSION}

Ein ARG, das vor einem FROM deklariert wurde, befindet sich außerhalb eines Build-Schritts und kann daher in keiner Anweisung nach einem FROM verwendet werden.

Im Allgemeinen sollten ARGs nach FROM platziert werden, wenn sie während FROM nicht benötigt werden:

FROM base:xy
ARG  ABC=123

Um den Standardwert eines ARG zu verwenden, der vor dem ersten FROM deklariert wurde, verwenden Sie eine ARG-Anweisung ohne Wert innerhalb eines Build-Schritts:

ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version

https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact

2voto

Khaled Boussoffara Punkte 1569

Sie können Umgebungsvariablen direkt beim Start des Containers übergeben:

docker run -e [Ihr_Variablenname = Ihr_Variablenwert] [Image zur Instanzierung]

Beispiel:

docker run --rm -e TARGET=192.168.1.9 ubuntu env

Die Ausgabe lautet:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=36399469e519
TARGET=192.168.1.9
HOME=/root

Die Zielvariable wurde zu Ihren Umgebungsvariablen des aktuellen Containers hinzugefügt!

1voto

Maksym Punkte 11

Korrigiere mich, wenn ich falsch liege. Die Frage war über Umgebungsvariablen - nicht über Argumente. Die Frage war, wie man eine ENV-Variable an den Container sendet - das bedeutet, dass der Container auf diese Variable verweisen kann. Daher denke ich, dass die Antwort folgende sein sollte:

  1. Es ist nicht notwendig, ARG zu verwenden, da es nur beim Erstellen des Images verwendet wird
  2. Wenn Sie eine Umgebungsvariable an den Container übergeben müssen, gibt es eine Syntax, die verwendet werden kann, um den Container auszuführen: docker run --name [container-name] -e "[variable-name]=[new-value]" [image-name]

-3voto

Valentin Kantor Punkte 1643

Fügen Sie den -e Schlüssel hinzu, um Umgebungsvariablen an den Container zu übergeben. Beispiel:

$ MYSQLHOSTIP=$(sudo docker inspect -format="{{ .NetworkSettings.IPAddress }}" $MYSQL_CONRAINER_ID)
$ sudo docker run -e DBIP=$MYSQLHOSTIP -i -t myimage /bin/bash

root@87f235949a13:/# echo $DBIP
172.17.0.2

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X