Lösung auf docker run "--env-Datei" geliefert-Datei nicht ausgewertet wird, wie erwartet
Mein Aktuelles setup für den Betrieb ein docker-container ist auf den Linien dieses:
- Ich habe eine
main.env
Datei:
# Main export PRIVATE_IP=\`echo localhost\` export MONGODB_HOST="$PRIVATE_IP" export MONGODB_URL="mongodb://$MONGODB_HOST:27017/Entwicklung"
-
In meinem service-Datei (upstart), ich source diese Datei
. /path/to/main.env
-
Ich dann rufen Sie
docker run
mit mehreren-e
für jeden von der Umgebungsvariablen ich möchte innerhalb des Containers. In diesem Fall würde ich so etwas wie:docker run -e MONGODB_URL=$MONGODB_URL ubuntu bash
-
Ich würde dann erwarten, dass
MONGODB_URL
im inneren des Behälters, um gleichmongodb://localhost:27017/development
. Beachten Sie, dass in der Realitätecho localhost
wird ersetzt durch einecurl
amazon-api, die für eine aktuellePRIVATE_IP
.
Wird dadurch ein wenig unhandlich werden, wenn Sie beginnen, mehr und mehr Umwelt-Variablen, die Sie brauchen zu geben, Ihre container. Es ist ein feiner Punkt, um zu sehen, was hier ist, dass die Umgebungsvariablen aufgelöst werden müssen zur Laufzeit, wie mit einem Aufruf zu curl
oder durch Bezugnahme auf andere env-Variablen.
Die Lösung, die ich hoffte zu verwenden ist:
- aufrufen
docker run
mit einem--env-file
parameter wie diese:
# Main PRIVATE_IP=\`echo localhost\` MONGODB_HOST="$PRIVATE_IP" MONGODB_URL="mongodb://$MONGODB_HOST:27017/Entwicklung"
- Dann meine
docker run
Befehl würden deutlich verkürzt werden, umdocker run --env-file=/path/to/main.env ubuntu bash
(keep in mind normalerweise habe ich rund 12-15 Umgebungsvariablen.
Dies ist, wo ich traf mein problem ist, dass im inneren des Behälters keine der Variablen zu lösen, wie erwartet. Stattdessen Ende ich mit:
- PRIVATE_IP=`echo localhost`
- MONGODB_HOST="$PRIVATE_IP"
- MONGODB_URL="mongodb://$MONGODB_HOST:27017/Entwicklung"
Ich könnte dies umgehen, indem Sie Folgendes tun:
- Beschaffung der
main.env
Datei. - Erstellen Sie eine Datei enthält nur die Namen der Variablen, die ich will (die Bedeutung der Hafenarbeiter würde die Suche nach Ihnen in der Umgebung).
- Dann ruft
docker run
mit dieser Datei als argument an--env-file
. Das würde funktionieren, würde aber bedeuten, ich müsste warten zwei Dateien statt einer, und wirklich nicht groß, der eine Verbesserung der aktuellen situation.
Was ich vorziehen würde, ist, um die Variablen zu lösen, wie erwartet.
Die nächste Frage zu mir, dass ich finden konnte ist:
12factor config Ansatz mit Docker
- Ich bemerkte, dass Ihre
main.env
ist Ihre Einstellung vars als literal-Zeichenfolgen. Haben Sie versucht, entfernen"
&'
? Lesen Sie mehr darüber, wie Docker verarbeitet Literale hier: docs.docker.com/reference/builder/#env - Nach docs in der env-Datei-syntax sollte einfach sein, die Schlüssel=Wert-Gegenstände. Nicht sicher, wie Sie die "export" behandelt werden würde in Ihrem Fall.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beide
--env
und--env-file
setup-Variablen und ersetzen nicht die verschachtelten Variablen.Solomon Hykes Gespräche über die Konfiguration von Containern zur Laufzeit und die den verschiedenen Ansätzen. Die eine, die für Sie arbeiten, ist die Lautstärke der Montage der main.env vom host in den container und Beschaffung es.
erstellen einer ENV-Datei ist nichts weiter als Schlüssel/Wert-Paare verarbeitet werden können in die normale shell-Befehle und an die Umwelt. Blick auf die bash-ein pragma.
Was Sie tun können, ist, erstellen Sie ein startup-Skript ausgeführt werden kann, wenn der container gestartet wird. Also, wenn Ihre aktuelle docker-Datei sieht ungefähr so aus
Ändern
In Ihrem start.sh script Folgendes tun:
Ich hatte ein sehr ähnliches problem zu diesem. Wenn ich an den Inhalt der env-Datei, um das Andockfenster als separate e-Direktiven lief dann alles fein aber wenn ich übergeben Sie die Datei mit --env-Datei, der container konnte nicht richtig laufen.
Stellt sich heraus, es waren einige vermeidbare Zeilenenden in der Datei (hatte ich kopiert aus dem Fenster und lief Andockfenster in Ubuntu). Wenn ich entfernt, die Ihnen den container gleich ran mit --env oder --env-Datei.