La solution DOCKER:
Il semble que docker-compose 1.5+ ait activé la substitution de variables: https://github.com/docker/compose/releases
Le dernier Docker Compose vous permet d'accéder aux variables d'environnement à partir de votre fichier de composition. Vous pouvez donc source vos variables d'environnement, puis exécutez Compose comme suit:
set -a
source .my-env
docker-compose up -d
Ensuite, vous pouvez référencer les variables dans docker-compose.yml en utilisant $ {VARIABLE}, comme ceci:
db:
image: "postgres:${POSTGRES_VERSION}"
Et voici plus d'informations sur les documents, prises ici: https://docs.docker.com/compose/compose-file/#variable-substitution
Lorsque vous exécutez docker-compose avec cette configuration, Compose recherche la variable d'environnement POSTGRES_VERSION dans le shell et remplace sa valeur par. Pour cet exemple, Compose résout l'image en postgres: 9.3 avant d'exécuter la configuration.
Si aucune variable d'environnement n'est définie, Compose se substitue avec une chaîne vide. Dans l'exemple ci-dessus, si POSTGRES_VERSION n'est pas défini, la valeur de l'option image est postgres :.
La syntaxe $ VARIABLE et $ {VARIABLE} est prise en charge. Les fonctionnalités étendues de style shell, telles que $ {VARIABLE-default} et $ {VARIABLE / foo / bar}, ne sont pas prises en charge.
Si vous devez mettre un signe dollar littéral dans une valeur de configuration, utilisez un signe dollar double ($$).
Et je crois que cette fonctionnalité a été ajoutée dans cette demande de tirage: https://github.com/docker/compose/pull/1765
La solution BASH:
Je remarque que les gens ont des problèmes avec le support des variables d'environnement de Docker. Au lieu de traiter des variables d'environnement dans Docker, revenons aux bases, comme bash! Voici une méthode plus flexible utilisant un script bash et un .env
fichier.
Un exemple de fichier .env:
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
puis exécutez ce script bash dans le même répertoire, qui devrait tout déployer correctement:
#!/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
Il vous suffit de référencer vos variables env dans votre fichier de composition avec la syntaxe bash habituelle (c'est- ${SECRET_KEY}
à- dire pour l'insérer à SECRET_KEY
partir du .env
fichier).
Notez que le COMPOSE_CONFIG
est défini dans mon .env
fichier et utilisé dans mon script bash, mais vous pouvez facilement le remplacer {$COMPOSE_CONFIG}
par le my-compose-file.yml
dans le script bash.
Notez également que j'ai étiqueté ce déploiement en nommant tous mes conteneurs avec le préfixe "myproject". Vous pouvez utiliser le nom de votre choix, mais cela permet d'identifier vos conteneurs afin que vous puissiez facilement les référencer plus tard. En supposant que vos conteneurs sont sans état, comme ils devraient l'être, ce script supprimera et redéploiera rapidement vos conteneurs en fonction de vos paramètres de fichier .env et de votre fichier YAML de composition.
Mise à jour
Comme cette réponse semble assez populaire, j'ai écrit un article de blog qui décrit mon flux de travail de déploiement Docker de manière plus approfondie: http://lukeswart.net/2016/03/lets-deploy-part-1/ Cela peut être utile lorsque vous ajoutez plus de complexité à une configuration de déploiement, comme les configurations nginx, les certificats LetsEncrypt et les conteneurs liés.