Ich möchte in der Lage sein, env-Variablen in docker-compose.yml zu verwenden, wobei die Werte zum Zeitpunkt der Docker-Komposition übergeben werden. Dies ist das Beispiel. Ich mache dies heute mit dem grundlegenden Docker-Befehl run, der um mein eigenes Skript gewickelt ist. Gibt es eine Möglichkeit, dies mit Compose ohne solche Bash-Wrapper zu erreichen?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
docker
docker-compose
Dmitry z
quelle
quelle
Antworten:
template.yml
, die Ihredocker-compose.yml
mit Umgebungsvariable ist.Eine neue Datei
docker-compose.yml
wird mit den korrekten Werten der Umgebungsvariablen generiert.Beispieldatei template.yml:
Beispieldatei env.sh:
quelle
Die DOCKER-Lösung:
Es sieht so aus, als hätte Docker-Compose 1.5+ die Substitution von Variablen aktiviert: https://github.com/docker/compose/releases
Mit dem neuesten Docker Compose können Sie über Ihre Compose-Datei auf Umgebungsvariablen zugreifen. Sie können also Ihre Umgebungsvariablen als Quelle verwenden und dann Compose wie folgt ausführen:
Dann können Sie die Variablen in docker-compose.yml mit $ {VARIABLE} wie folgt referenzieren:
Weitere Informationen aus den Dokumenten finden Sie hier: https://docs.docker.com/compose/compose-file/#variable-substitution
Und ich glaube, diese Funktion wurde in dieser Pull-Anfrage hinzugefügt: https://github.com/docker/compose/pull/1765
Die BASH-Lösung:
Ich stelle fest, dass Leute Probleme mit der Unterstützung von Docker-Umgebungsvariablen haben. Anstatt sich mit Umgebungsvariablen in Docker zu befassen, kehren wir zu den Grundlagen wie bash zurück! Hier ist eine flexiblere Methode mit einem Bash-Skript und einem
.env
Datei verwendet.Ein Beispiel für eine .env-Datei:
Führen Sie dann dieses Bash-Skript im selben Verzeichnis aus, in dem alles ordnungsgemäß bereitgestellt werden soll:
Verweisen Sie einfach auf Ihre env-Variablen in Ihrer Compose-Datei mit der üblichen Bash-Syntax (dh
${SECRET_KEY}
zum Einfügen derSECRET_KEY
aus der.env
Datei ).Beachten Sie, dass das
COMPOSE_CONFIG
in meiner.env
Datei definiert und in meinem Bash-Skript verwendet wird, aber Sie können es einfach durch{$COMPOSE_CONFIG}
das ersetzenmy-compose-file.yml
im Bash-Skript .Beachten Sie auch, dass ich diese Bereitstellung gekennzeichnet habe, indem ich alle meine Container mit dem Präfix "myproject" benannt habe. Sie können einen beliebigen Namen verwenden, aber es hilft Ihnen, Ihre Container zu identifizieren, damit Sie später problemlos darauf verweisen können. Angenommen, Ihre Container sind zustandslos, wie sie sein sollten, entfernt dieses Skript Ihre Container schnell und stellt sie gemäß Ihren .env-Dateiparametern und Ihrer komponierten YAML-Datei erneut bereit.
Update Da diese Antwort sehr beliebt zu sein scheint, habe ich einen Blog-Beitrag geschrieben, in dem mein Docker-Bereitstellungsworkflow ausführlicher beschrieben wird: http://lukeswart.net/2016/03/lets-deploy-part-1/ Dies kann beim Hinzufügen hilfreich sein Komplexität einer Bereitstellungskonfiguration wie Nginx-Konfigurationen, LetsEncrypt-Zertifikate und verknüpfte Container.
quelle
grep foo file.text
stattcat file.text | grep foo
. In meinem Fall musste ichexport $(grep "^[^#]" .config | xargs) && cat docker-compose.yml | envsubst
.docker-compose up
und nicht mitdocker-compose run
..env
Unter hinzufügenenv_file
. Dann können Sie die Variablen indocker-compose.yml
using${VARIABLE}
Es scheint, dass Docker-Compose jetzt native Unterstützung für Standardumgebungsvariablen in der Datei bietet .
Alles, was Sie tun müssen, ist, Ihre Variablen in einer Datei mit dem Namen zu deklarieren,
.env
und sie werden in docker-compose.yml verfügbar sein.Zum Beispiel für
.env
Dateien mit Inhalten:Sie können auf Ihre Variable zugreifen
docker-compose.yml
oder sie in den Container weiterleiten:quelle
.env
, zum Beispielconfig.env
hat bei mir nicht funktioniert.Das Folgende gilt für Docker-Compose 3.x. Legen Sie Umgebungsvariablen im Container fest
Erstellen Sie eine .env-Datei am selben Speicherort wie die Datei docker-compose.yml
und Ihre Erstellungsdatei wird wie sein
Quelle
quelle
Wenn Sie Umgebungsvariablen für Volumes verwenden, benötigen Sie:
Erstellen Sie eine ENV- Datei in demselben Ordner, in dem sich die
docker-compose.yaml
Datei befindetDeklarieren Sie die Variable in der
.env
Datei:Wechseln Sie
$hostname
zu${HOSTNAME}
atdocker-compose.yaml
fileNatürlich können Sie dies dynamisch für jeden Build tun, wie:
quelle
The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy.
Am besten geben Sie Umgebungsvariablen außerhalb der
docker-compose.yml
Datei an. Sie können verwendenenv_file
Einstellung verwenden und Ihre Umgebungsdatei in derselben Zeile definieren. Wenn Sie dann ein Docker-Compose erneut ausführen, sollten die Container mit den neuen Umgebungsvariablen neu erstellt werden.So sieht meine docker-compose.yml aus:
quelle
Du kannst ... noch nicht. Aber dies ist eine Alternative, denken Sie wie ein Docker-Composer.yml-Generator:
https://gist.github.com/Vad1mo/9ab63f28239515d4dafd
Grundsätzlich ein Shell-Skript, das Ihre Variablen ersetzt. Sie können auch die Grunt-Aufgabe verwenden, um Ihre Docker-Erstellungsdatei am Ende Ihres CI-Prozesses zu erstellen.
quelle
Ich habe ein einfaches Bash-Skript, das ich dafür erstellt habe. Es bedeutet nur, es vor der Verwendung in Ihrer Datei auszuführen: https://github.com/antonosmond/subber
Erstellen Sie einfach Ihre Erstellungsdatei mit doppelten geschweiften Klammern, um Umgebungsvariablen zu kennzeichnen, z.
Alles in doppelten geschweiften Klammern wird durch die gleichnamige Umgebungsvariable ersetzt, wenn ich die folgenden Umgebungsvariablen festgelegt hätte:
beim Ausführen
subber docker-compose.yml
der resultierenden Datei würde wie folgt aussehen:quelle
Soweit ich weiß, ist dies ein Work-in-Progress. Sie wollen es tun, aber es ist noch nicht veröffentlicht. Siehe 1377 (die "neue" 495 , die von @Andy erwähnt wurde).
Am Ende habe ich den von @Thomas vorgeschlagenen Ansatz ".yml als Teil von CI generieren" implementiert.
quelle
füge env zur .env Datei hinzu
Sowie
dann speichern Sie es unter
deploy.sh
quelle
Verwenden Sie die ENV-Datei, um dynamische Werte in docker-compse.yml zu definieren. Sei es Port oder irgendein anderer Wert.
Beispiel Docker-Compose:
In der ENV-Datei können Sie den Wert dieser Variablen definieren:
quelle
Verwenden Sie die Version 3.6:
Ich habe es über diesen Link https://github.com/docker/cli/issues/939 erhalten
quelle
Seit 1.25.4 unterstützt Docker-Compose die Option
--env-file
, mit der Sie eine Datei mit Variablen angeben können.Ihre sollte so aussehen:
Und der Befehl:
quelle