Ich baue einen Container für eine Ruby-App. Die Konfiguration meiner App ist in Umgebungsvariablen enthalten (mit dotenv in die App geladen ).
Eine dieser Konfigurationsvariablen ist die öffentliche IP-Adresse der App, die intern zum Erstellen von Links verwendet wird. Ich muss einen dnsmasq-Eintrag hinzufügen, der diese IP auf 127.0.0.1 im Container verweist, damit die Links der App abgerufen werden können, als wäre sie nicht containerisiert.
Ich versuche daher, ENV
in meiner Docker-Datei eine festzulegen, die eine Umgebungsvariable an den Container übergibt.
Ich habe ein paar Dinge ausprobiert.
ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`
Alles übergibt jedoch die Zeichenfolge "REQUEST_DOMAIN" anstelle des Werts der Umgebungsvariablen. Gibt es eine Möglichkeit, Umgebungsvariablenwerte vom Hostcomputer an den Container zu übergeben?
Your image will not build if you have referenced an ARG in your Dockerfile but excluded it in --build-arg
Sie liegen falsch. Sie können ein Image mit Referenzen auch ohne --build-arg erstellen. Darüber hinaus können Sie den Standardwert für das Build-Argument festlegen.So können Sie tun:
cat Dockerfile | envsubst | docker build -t my-target -
Dann haben Sie eine Docker-Datei mit so etwas wie:
Ich denke, es könnte ein Problem mit einigen Sonderzeichen geben, aber dies funktioniert zumindest in den meisten Fällen.
quelle
envsubst
als Teil von bekommenbrew install gettext
. Aufgrund möglicher Konflikte mit dem BSD-Build-System handelt es sich jedoch nur um "Keg-only", und es werden keine Symlnks erstellt. Es ist jedoch sicher, diesenln -s /usr/local/Cellar/gettext/*/bin/envsubst /usr/local/bin/
einen Befehl zu Ihrem PATH hinzuzufügen. (Es sind wirklich die Bibliotheken, die das/usr/local/Cellar/gettext/*/bin/envsubst
docker build -
insbesondere nicht, wenn Sie auf relative Pfade aus Ihrer Docker-Datei verweisen, unabhängig von der Ersetzung von env var.docker build
statt. Beispielcat Dockerfile | envsubst > DockerfileWithEnvVars
docker build -t my-target -f DockerfileWithEnvVars .
rm DockerfileWithEnvVars
envsubst < Dockerfile | sponge Dockerfile
Eine Alternative,
envsubst
ohne die Fähigkeit zu verlieren, Befehle wieCOPY
oder zu verwendenADD
, und ohne Zwischendateien zu verwenden, wäre die Verwendung von Bashs Prozessersetzung :quelle
unable to prepare context: the Dockerfile (/dev/fd/63) must be within the build context
Laden Sie Umgebungsvariablen aus einer Datei, die Sie zur Laufzeit erstellen.
... dann in der Docker-Datei
Dabei testet test.sh MYVAR aus env.sh.
quelle
Wenn Sie nur alle Umgebungsvariablen ($ ExampleEnvVar) in einer Docker-Datei suchen und ersetzen möchten, erstellen Sie diese:
envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -
quelle
envsubst < ./Dockerfile | docker build -squash -t ${DOCKIMG}:${VERSION} . -f -
Wo dieFROM
Zeile die Umgebungsvariable verwendet.-e
Schlüssel zum Übergeben von Umgebungsvariablen an den Container hinzufügen . Beispiel:quelle