373 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?

574voto

Daniel van Flymen Punkte 9809

Sie sollten die ARG Direktive in Ihrer Dockerdatei verwenden, die für diesen Zweck gedacht ist.

Die ARG Anweißung definiert eine Variable, die Benutzer beim Erstellen mit dem docker build Befehl über die --build-arg = Flagge passieren können.

Also wird Ihre Dockerdatei diese Zeile enthalten:

ARG request_domain

oder wenn Sie einen Standardwert bevorzugen:

ARG request_domain=127.0.0.1

Jetzt können Sie diese Variable in Ihrer Dockerdatei referenzieren:

ENV request_domain=$request_domain

dann bauen Sie Ihren Container folgendermaßen:

$ docker build --build-arg request_domain=mydomain Dockerfile

Hinweis 1: Ihr Bild wird nicht erstellt, wenn Sie einen ARG in Ihrer Dockerdatei referenziert haben, aber ihn in --build-arg ausgeschlossen haben.

Hinweis 2: Wenn ein Benutzer ein Build-Argument angibt, das nicht in der Dockerdatei definiert war, wird eine Warnung ausgegeben:

[Warnung] Ein oder mehrere Build-Argumente [foo] wurden nicht verwendet.

69voto

jonasfj Punkte 2172

So können Sie folgendes tun: cat Dockerfile | envsubst | docker build -t my-target -

Dann haben Sie eine Dockerfile mit so etwas wie:

ENV MY_ENV_VAR $MY_ENV_VAR

Ich denke, es könnte ein Problem mit einigen Sonderzeichen geben, aber zumindest funktioniert dies in den meisten Fällen.

59voto

Zincfan Punkte 281

Dies ist für diejenigen, die Umgebungsvariablen von docker-compose mithilfe der Datei .env an das Dockerfile übergeben möchten, während des Builds und dann diese Argumente als Umgebungsvariablen an den Container übergeben möchten. Typische docker-compose-Datei

Dienste:
  Web:
    build:
      Kontext: ./api
      Dockerfile: Dockerfile
      args:
        - SECRET_KEY=$SECRET_KEY
        - DATABASE_URL=$DATABASE_URL
        - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID

Übergeben Sie die in der .env-Datei vorhandenen Umgebungsvariablen als Argumente im Build-Befehl. Typische .env-Datei

SECRET_KEY=blahblah
DATABASE_URL=dburl

Wenn Sie jetzt den Befehl docker-compose up -d ausführen, nimmt die docker-compose-Datei Werte aus der .env-Datei und übergibt sie an die docker-compose-Datei. Jetzt enthält das Dockerfile von web all diese Variablen durch Argumente während des Builds. Jetzt typisches Dockerfile von web,

VON python:3.6-alpine

ARG SECRET_KEY
ARG DATABASE_URL
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
ARG AWS_BUCKET
ARG AWS_REGION
ARG CLOUDFRONT_DOMAIN

ENV CELERY_BROKER_URL redis://redis:6379/0
ENV CELERY_RESULT_BACKEND redis://redis:6379/0
ENV C_FORCE_ROOT true
ENV SECRET_KEY  ${SECRET_KEY?secretkeynotset}
ENV DATABASE_URL ${DATABASE_URL?envdberror}

Jetzt haben wir diese secret_key und db url als Argument im Dockerfile erhalten. Jetzt verwenden wir diese in ENV als ENV SECRET_KEY ${SECRET_KEY?secretkeynotset}. Jetzt hat sogar der Docker-Container diese Variablen in seiner Umgebung. _Vergessen Sie nicht, ARG $SECRET_KEY zu verwenden (was ich getan habe). Es sollte ARG SECRET_KEY sein_

24voto

Eine Alternative wäre die Verwendung von envsubst, ohne die Möglichkeit zu verlieren, Befehle wie COPY oder ADD zu verwenden, und ohne Zwischendateien zu verwenden, Bash's Prozesssubstitution:

docker build -f <(envsubst < Dockerfile) -t my-target .

17voto

Dan C Punkte 171

Umgebungsvariablen aus einer Datei laden, die Sie zur Laufzeit erstellen.

export MYVAR="my_var_outside"
cat > build/env.sh <

`... dann im Dockerfile

ADD build /build
RUN /build/test.sh

wo test.sh MYVAR aus env.sh lädt

#!/bin/bash
. /build/env.sh
echo $MYVAR > /tmp/testfile`

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