Définir, utiliser et gérer les variables dans un fichier Compose avec l'interpolation
Un fichier Compose peut utiliser des variables pour offrir plus de flexibilité. Si vous souhaitez basculer rapidement entre les tags d'image pour tester plusieurs versions, ou ajuster une source de volume à votre environnement local, vous n'avez pas besoin d'éditer le fichier Compose à chaque fois, vous pouvez simplement définir des variables qui insèrent des valeurs dans votre fichier Compose au moment de l'exécution.
L'interpolation peut également être utilisée pour insérer des valeurs dans votre fichier Compose au moment de l'exécution, qui sont ensuite utilisées pour transmettre des variables dans l'environnement de votre conteneur.
Voici un exemple simple :
$ cat .env
TAG=v1.5
$ cat compose.yaml
services:
web:
image: "webapp:${TAG}"
Lorsque vous exécutez docker compose up
, le service web
défini dans le fichier Compose interpole l'image webapp:v1.5
qui a été définie dans le fichier .env
. Vous pouvez vérifier cela avec la
commande config, qui affiche votre configuration d'application résolue sur le terminal :
$ docker compose config
services:
web:
image: 'webapp:v1.5'
Syntaxe d'interpolation
L'interpolation est appliquée pour les valeurs non quotées et quotées avec des guillemets doubles.
Les expressions avec accolades (${VAR}
) et sans accolades ($VAR
) sont prises en charge.
Pour les expressions avec accolades, les formats suivants sont pris en charge :
- Substitution directe
${VAR}
-> valeur deVAR
- Valeur par défaut
${VAR:-default}
-> valeur deVAR
si définie et non vide, sinondefault
${VAR-default}
-> valeur deVAR
si définie, sinondefault
- Valeur requise
${VAR:?error}
-> valeur deVAR
si définie et non vide, sinon quitte avec erreur${VAR?error}
-> valeur deVAR
si définie, sinon quitte avec erreur
- Valeur alternative
${VAR:+replacement}
->replacement
siVAR
est définie et non vide, sinon vide${VAR+replacement}
->replacement
siVAR
est définie, sinon vide
Pour plus d'informations, voir Interpolation dans la spécification Compose.
Façons de définir des variables avec l'interpolation
Docker Compose peut interpoler des variables dans votre fichier Compose à partir de plusieurs sources.
Notez que lorsque la même variable est déclarée par plusieurs sources, la priorité s'applique :
- Variables de votre environnement shell
- Si
--env-file
n'est pas défini, variables définies par un fichier.env
dans le répertoire de travail local (PWD
) - Variables d'un fichier défini par
--env-file
ou un fichier.env
dans le répertoire du projet
Vous pouvez vérifier les variables et valeurs utilisées par Compose pour interpoler le modèle Compose en exécutant docker compose config --environment
.
Fichier .env
Un fichier .env
dans Docker Compose est un fichier texte utilisé pour définir des variables qui doivent être rendues disponibles pour l'interpolation lors de l'exécution de docker compose up
. Ce fichier contient généralement des paires clé-valeur de variables, et il vous permet de centraliser et gérer la configuration en un seul endroit. Le fichier .env
est utile si vous avez plusieurs variables que vous devez stocker.
Le fichier .env
est la méthode par défaut pour définir des variables. Le fichier .env
doit être placé à la racine du répertoire du projet à côté de votre fichier compose.yaml
. Pour plus d'informations sur le formatage d'un fichier d'environnement, voir Syntaxe des fichiers d'environnement.
Exemple de base :
$ cat .env
## définir COMPOSE_DEBUG basé sur DEV_MODE, par défaut false
COMPOSE_DEBUG=${DEV_MODE:-false}
$ cat compose.yaml
services:
webapp:
image: my-webapp-image
environment:
- DEBUG=${COMPOSE_DEBUG}
$ DEV_MODE=true docker compose config
services:
webapp:
environment:
DEBUG: "true"
Informations supplémentaires
-
Si vous définissez une variable dans votre fichier
.env
, vous pouvez la référencer directement dans votrecompose.yaml
avec l'attributenvironment
. Par exemple, si votre fichier.env
contient la variable d'environnementDEBUG=1
et que votre fichiercompose.yaml
ressemble à ceci :services: webapp: image: my-webapp-image environment: - DEBUG=${DEBUG}
Docker Compose remplace
${DEBUG}
par la valeur du fichier.env
ImportantSoyez conscient de la priorité des variables d'environnement lors de l'utilisation de variables dans un fichier
.env
comme variables d'environnement dans l'environnement de votre conteneur. -
Vous pouvez placer votre fichier
.env
dans un emplacement autre que la racine du répertoire de votre projet, puis utiliser l'option--env-file
dans la CLI pour que Compose puisse s'y rendre. -
Votre fichier
.env
peut être remplacé par un autre fichier.env
s'il est substitué avec--env-file
.
ImportantLa substitution à partir de fichiers
.env
est une fonctionnalité de Docker Compose CLI.Elle n'est pas prise en charge par Swarm lors de l'exécution de
docker stack deploy
.
Syntaxe du fichier .env
Les règles de syntaxe suivantes s'appliquent aux fichiers d'environnement :
- Les lignes commençant par
#
sont traitées comme des commentaires et ignorées. - Les lignes vides sont ignorées.
- Les valeurs non quotées et quotées avec des guillemets doubles (
"
) ont l'interpolation appliquée. - Chaque ligne représente une paire clé-valeur. Les valeurs peuvent être optionnellement quotées.
VAR=VAL
->VAL
VAR="VAL"
->VAL
VAR='VAL'
->VAL
- Les commentaires en ligne pour les valeurs non quotées doivent être précédés d'un espace.
VAR=VAL # comment
->VAL
VAR=VAL# not a comment
->VAL# not a comment
- Les commentaires en ligne pour les valeurs quotées doivent suivre le guillemet fermant.
VAR="VAL # not a comment"
->VAL # not a comment
VAR="VAL" # comment
->VAL
- Les valeurs entre guillemets simples (
'
) sont utilisées littéralement.VAR='$OTHER'
->$OTHER
VAR='${OTHER}'
->${OTHER}
- Les guillemets peuvent être échappés avec
\
.VAR='Let\'s go!'
->Let's go!
VAR="{\"hello\": \"json\"}"
->{"hello": "json"}
- Les séquences d'échappement shell communes incluant
\n
,\r
,\t
, et\\
sont prises en charge dans les valeurs quotées avec des guillemets doubles.VAR="some\tvalue"
->some value
VAR='some\tvalue'
->some\tvalue
VAR=some\tvalue
->some\tvalue
Substituer avec --env-file
Vous pouvez définir des valeurs par défaut pour plusieurs variables d'environnement, dans un fichier .env
puis passer le fichier comme argument dans la CLI.
L'avantage de cette méthode est que vous pouvez stocker le fichier n'importe où et le nommer de manière appropriée, par exemple,
Ce chemin de fichier est relatif au répertoire de travail actuel où la commande Docker Compose est exécutée. Passer le chemin du fichier se fait en utilisant l'option --env-file
:
$ docker compose --env-file ./config/.env.dev up
Informations supplémentaires
- Cette méthode est utile si vous voulez temporairement remplacer un fichier
.env
qui est déjà référencé dans votre fichiercompose.yaml
. Par exemple, vous pourriez avoir différents fichiers.env
pour la production (.env.prod
) et les tests (.env.test
). Dans l'exemple suivant, il y a deux fichiers d'environnement,.env
et.env.dev
. Les deux ont des valeurs différentes définies pourTAG
.$ cat .env TAG=v1.5 $ cat ./config/.env.dev TAG=v1.6 $ cat compose.yaml services: web: image: "webapp:${TAG}"
--env-file
n'est pas utilisé dans la ligne de commande, le fichier.env
est chargé par défaut :$ docker compose config services: web: image: 'webapp:v1.5'
--env-file
remplace le chemin de fichier par défaut :$ docker compose --env-file ./config/.env.dev config services: web: image: 'webapp:v1.6'
--env-file
, Compose retourne une erreur :$ docker compose --env-file ./doesnotexist/.env.dev config ERROR: Couldn't find env file: /home/user/./doesnotexist/.env.dev
- Vous pouvez utiliser plusieurs options
--env-file
pour spécifier plusieurs fichiers d'environnement, et Docker Compose les lit dans l'ordre. Les fichiers ultérieurs peuvent remplacer les variables des fichiers précédents.$ docker compose --env-file .env --env-file .env.override up
- Vous pouvez remplacer des variables d'environnement spécifiques depuis la ligne de commande lors du démarrage des conteneurs.
$ docker compose --env-file .env.dev up -e DATABASE_URL=mysql://new_user:new_password@new_db:3306/new_database
Fichier .env
local versus fichier .env
du <répertoire de projet>
Un fichier .env
peut également être utilisé pour déclarer des variables d'environnement prédéfinies utilisées pour contrôler le comportement de Compose et les fichiers à charger.
Lorsqu'exécuté sans drapeau --env-file
explicite, Compose recherche un fichier .env
dans votre répertoire de travail (PWD) et charge les valeurs à la fois pour l'auto-configuration et l'interpolation. Si les valeurs de ce fichier définissent la variable prédéfinie COMPOSE_FILE
, ce qui résulte en un répertoire de projet défini vers un autre dossier, Compose chargera un second fichier .env
, s'il est présent. Ce second fichier .env
a une priorité plus faible.
Ce mécanisme permet d'invoquer un projet Compose existant avec un ensemble personnalisé de variables comme substitutions, sans avoir besoin de passer des variables d'environnement par la ligne de commande.
$ cat .env
COMPOSE_FILE=../compose.yaml
POSTGRES_VERSION=9.3
$ cat ../compose.yaml
services:
db:
image: "postgres:${POSTGRES_VERSION}"
$ cat ../.env
POSTGRES_VERSION=9.2
$ docker compose config
services:
db:
image: "postgres:9.3"
Substituer depuis le shell
Vous pouvez utiliser des variables d'environnement existantes de votre machine hôte ou de l'environnement shell où vous exécutez les commandes docker compose
. Cela vous permet d'injecter dynamiquement des valeurs dans votre configuration Docker Compose au moment de l'exécution.
Par exemple, supposons que le shell contient POSTGRES_VERSION=9.3
et que vous fournissez la configuration suivante :
db:
image: "postgres:${POSTGRES_VERSION}"
Lorsque vous exécutez docker compose up
avec cette configuration, Compose recherche la variable d'environnement POSTGRES_VERSION
dans le shell et substitue sa valeur. Pour cet exemple, Compose résout l'image en postgres:9.3
avant d'exécuter la configuration.
Si une variable d'environnement n'est pas définie, Compose substitue par une chaîne vide. Dans l'exemple précédent, si POSTGRES_VERSION
n'est pas définie, la valeur pour l'option image est postgres:
.
Note
postgres:
n'est pas une référence d'image valide. Docker attend soit une référence sans tag, commepostgres
qui utilise par défaut la dernière image, ou avec un tag tel quepostgres:15
.