Je voudrais pouvoir utiliser des variables env dans docker-compose.yml, avec des valeurs passées au moment de docker-compose up. Voici l'exemple. Je le fais aujourd'hui avec la commande de base docker run, qui est enroulée autour de mon propre script. Existe-t-il un moyen de le réaliser avec compose, sans de tels wrappers bash?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
docker
docker-compose
Dmitry z
la source
la source
Réponses:
template.yml
, qui est votredocker-compose.yml
variable d'environnement.Un nouveau fichier
docker-compose.yml
sera généré avec les valeurs correctes des variables d'environnement.Exemple de fichier template.yml:
Exemple de fichier env.sh:
la source
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:
Ensuite, vous pouvez référencer les variables dans docker-compose.yml en utilisant $ {VARIABLE}, comme ceci:
Et voici plus d'informations sur les documents, prises ici: https://docs.docker.com/compose/compose-file/#variable-substitution
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:
puis exécutez ce script bash dans le même répertoire, qui devrait tout déployer correctement:
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 lemy-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.
la source
grep foo file.text
au lieu decat file.text | grep foo
. Dans mon cas, je devais le faireexport $(grep "^[^#]" .config | xargs) && cat docker-compose.yml | envsubst
.docker-compose up
et pas avecdocker-compose run
..env
sousenv_file
. Ensuite, vous pouvez référencer les variables endocker-compose.yml
utilisant${VARIABLE}
Il semble que docker-compose dispose désormais d'un support natif pour les variables d'environnement par défaut dans le fichier .
il vous suffit de déclarer vos variables dans un fichier nommé
.env
et elles seront disponibles dans docker-compose.yml.Par exemple, pour un
.env
fichier avec contenu:Vous pouvez accéder à votre variable à l'intérieur
docker-compose.yml
ou les transférer dans le conteneur:la source
.env
, par exempleconfig.env
n'a pas fonctionné pour moi.Ce qui suit s'applique à docker-compose 3.x Définir les variables d'environnement à l'intérieur du conteneur
Créez un fichier .env au même emplacement que le docker-compose.yml
et votre fichier de composition sera comme
la source
la source
Lorsque vous utilisez des variables d'environnement pour des volumes, vous avez besoin:
créer un fichier .env dans le même dossier qui contient le
docker-compose.yaml
fichierdéclarer une variable dans le
.env
fichier:Changer
$hostname
d'${HOSTNAME}
audocker-compose.yaml
fichierBien sûr, vous pouvez le faire dynamiquement sur chaque build comme:
la source
The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy.
La meilleure façon est de spécifier des variables d'environnement en dehors du
docker-compose.yml
fichier. Vous pouvez utiliser leenv_file
paramètre et définir votre fichier d'environnement sur la même ligne. Ensuite, faire à nouveau un docker-compose devrait recréer les conteneurs avec les nouvelles variables d'environnement.Voici à quoi ressemble mon docker-compose.yml:
la source
Vous ne pouvez pas ... encore. Mais c'est une alternative, pensez comme un générateur docker-composer.yml:
https://gist.github.com/Vad1mo/9ab63f28239515d4dafd
Fondamentalement, un script shell qui remplacera vos variables. Vous pouvez également utiliser la tâche Grunt pour créer votre fichier de composition Docker à la fin de votre processus CI.
la source
J'ai un script bash simple que j'ai créé pour cela, cela signifie simplement l'exécuter sur votre fichier avant utilisation: https://github.com/antonosmond/subber
Fondamentalement, créez simplement votre fichier de composition en utilisant des accolades doubles pour désigner les variables d'environnement, par exemple:
Tout élément en double accolade sera remplacé par la variable d'environnement du même nom, donc si j'avais les variables d'environnement suivantes définies:
lors de l'exécution
subber docker-compose.yml
du fichier résultant ressemblerait à:la source
À ma connaissance, il s'agit d'un travail en cours. Ils veulent le faire, mais ce n'est pas encore sorti. Voir 1377 (le "nouveau" 495 mentionné par @Andy).
J'ai fini par implémenter l'approche "générer .yml dans le cadre de CI" comme proposé par @Thomas.
la source
ajouter env au fichier .env
Tel que
puis enregistrez-le dans
deploy.sh
la source
Utilisez le fichier .env pour définir des valeurs dynamiques dans docker-compse.yml. Que ce soit le port ou toute autre valeur.
Exemple de composition de docker:
Dans le fichier .env, vous pouvez définir la valeur de ces variables:
la source
Utilisez la version 3.6:
Je l'ai obtenu à partir de ce lien https://github.com/docker/cli/issues/939
la source
Depuis 1.25.4, docker-compose prend en charge l'option
--env-file
qui vous permet de spécifier un fichier contenant des variables.Le vôtre devrait ressembler à ceci:
Et la commande:
la source