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:
set -a
source .my-env
docker-compose up -d
Dann können Sie die Variablen in docker-compose.yml mit $ {VARIABLE} wie folgt referenzieren:
db:
image: "postgres:${POSTGRES_VERSION}"
Weitere Informationen aus den Dokumenten finden Sie hier: https://docs.docker.com/compose/compose-file/#variable-substitution
Wenn Sie Docker-Compose mit dieser Konfiguration ausführen, sucht Compose in der Shell nach der Umgebungsvariablen POSTGRES_VERSION und ersetzt ihren Wert in. In diesem Beispiel löst Compose das Image in postgres: 9.3 auf, bevor die Konfiguration ausgeführt wird.
Wenn keine Umgebungsvariable festgelegt ist, wird Compose durch eine leere Zeichenfolge ersetzt. Wenn im obigen Beispiel POSTGRES_VERSION nicht festgelegt ist, lautet der Wert für die Bildoption postgres:.
Es wird sowohl die Syntax $ VARIABLE als auch $ {VARIABLE} unterstützt. Erweiterte Funktionen im Shell-Stil wie $ {VARIABLE-default} und $ {VARIABLE / foo / bar} werden nicht unterstützt.
Wenn Sie ein Konfigurationswert mit einem wörtlichen Dollarzeichen versehen müssen, verwenden Sie ein doppeltes Dollarzeichen ($$).
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:
EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM
# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml
Führen Sie dann dieses Bash-Skript im selben Verzeichnis aus, in dem alles ordnungsgemäß bereitgestellt werden soll:
#!/bin/bash
docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d
Verweisen Sie einfach auf Ihre env-Variablen in Ihrer Compose-Datei mit der üblichen Bash-Syntax (dh ${SECRET_KEY}
zum Einfügen der SECRET_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.