Dockerfile: so stellen Sie die env-variable aus der Datei-Inhalt
Ich möchte eine Umgebungsvariable festlegen, die in meinem Dockerfile.
Habe ich eine .env
- Datei, die wie folgt aussieht:
FOO=bar
.
In meinem Dockerfile, ich habe einen Befehl, analysiert den Inhalt der Datei und weist es FOO.
RUN 'export FOO=$(echo "$(cut -d'=' -f2 <<< $(grep FOO .env))")'
Das problem das ich laufen in ist, dass das obige Skript nicht zurück, was ich es brauche. In der Tat, es nichts zurückgibt.
Wenn ich docker-compose up --build
es schlägt fehl mit dieser Fehlermeldung.
The command '/bin/sh -c 'export FOO=$(echo "$(cut -d'=' -f2 <<< $(grep FOO .env))")'' returned a non-zero code: 127
Ich weiß, dass der Befehl /bin/sh -c 'echo "$(cut -d'=' -f2 <<< $(grep FOO .env))"'
erzeugt die korrekte Ausgabe, aber ich kann nicht herausfinden, wie zu ordnen, die Ausgabe auf eine Umgebungsvariable.
Irgendwelche Vorschläge, was ich falsch mache?
- Es gibt mehrere Themen hier. Wollen Sie diese Variablen, die im das Bild, für den rest zu bauen, oder einfach nur, dass man den Befehl ausführen? Haben Sie kopieren Sie .env-Datei, die in das Bild? Und neben den 127 Fehler, hast du andere logs von dem build?
- Hinzugefügt habe ich die Datei (anstatt kopieren). Ich versuche mit einer container-Breite von env-Variablen.
- Nicht viel mehr in der Art der protokollierten Fehler.
- Beachten Sie, dass
<<<
ist das nicht ein standard Umleitung Betreiber und einige leichtere Basis Bilder haben Schalen, die Umsetzung sehr wenig, das nicht im standard.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Umgebungsvariablen
Wenn Sie möchten, eine Reihe von Umgebungsvariablen in Ihrem docker-image (in den Container), kann man einfach
env_file
Konfigurations-option in Ihrem docker-Komponieren.yml-Datei. Mit dieser option werden alle Einträge in die .env-Datei wird festgelegt, wie die Variablen in der Bild und damit in die Container.Mehr Infos über env_file
Bauen ARGS
Wenn Ihre Forderung ist die Nutzung von einigen Variablen nur innerhalb Ihres
Dockerfile
dann geben Sie Sie, wie untenARG FOO
ARG FOO1
ARG FOO2
etc...
Und müssen Sie angeben, diese Argumente unter der
build
Schlüssel in Ihremdocker-compose.yml
build:
context: .
args:
FOO: BAR
FOO1: BAR1
FOO2: BAR2
Mehr Infos über args
Zugreifen .env-Werte im Andockfenster-Komponieren.yml-Datei
Wenn Sie in sind vorbei, einige Werte in Ihrem docker-compose-Datei aus dem .env dann können Sie ganz einfach Ihr .env-Datei gleichen Ort wie die docker-Komponieren.yml-Datei und Sie können die Werte für die Konfiguration, wie unten;
ports:
- "${HOST_PORT}:80"
So, als Beispiel können Sie die host-port für den Dienst, indem Sie Sie in Ihre .env-Datei
Bitte überprüfen Sie diese
Ersten, die Fehler, die Sie sehen. Ich vermute, es gibt einen Fehler "nicht gefunden" - Meldung nicht in der Frage. Wenn das der Fall ist, dann das erste Problem ist, dass Sie versucht, eine ausführbare Datei auszuführen, die die vollständige Zeichenfolge, da Sie eingeschlossen in Anführungszeichen. Anstatt zu versuchen, führen Sie den shell-Befehl "exportieren", ist es zu finden versuchen, um eine Binärdatei, die vollständige Zeichenfolge mit Leerzeichen und alle. So arbeiten Vergangenheit, die Fehler, die Sie bräuchte, um unquote Ihren LAUF string:
Jedoch, dass lösen nicht die zugrunde liegende problem. Das Ergebnis einer
RUN
Befehl Andockfenster speichert die änderungen auf das Dateisystem als neue Ebene in den Bild. Nur änderungen am Dateisystem gespeichert werden. Der shell-Befehl ausgeführt werden änderungen der shell-Zustand, aber dann, dass die shell sich beendet, wird der run-Befehl gibt, und der Staat, in dem shell, einschließlich Umgebungsvariablen, ist Weg.Um dieses Problem zu lösen für Ihre Anwendung, es gibt zwei Optionen, die ich denken kann:
Option A: inject bauen args in eurem build für alle die .env-Werte, und ein Skript schreiben, das fordert, bauen mit der richtigen
--build-arg
flag für jede variable. Innerhalb der Dockerfile, Sie haben zwei Zeilen für die einzelnen Variablen:Option B: injizieren Sie Ihr .env-Datei und verarbeiten Sie es mit einem entrypoint in den container. Dieser entrypoint laufen konnte Ihrer export-Befehl vor dem Auftakt der eigentlichen Anwendung. Sie müssen auch dies tun, für jede
RUN
Befehl während dem bauen, wo Sie brauchen diese Variablen. Eine Kurzform, die ich für das ziehen in die Datei Inhalt auf Umgebungsvariablen ist:set -a && . .env && set +a
ist groß.