Priorité des variables d'environnement dans Docker Compose
Lorsque la même variable d'environnement est définie dans plusieurs sources, Docker Compose suit une règle de priorité pour déterminer la valeur de cette variable dans l'environnement de votre conteneur.
Cette page contient des informations sur le niveau de priorité que prend chaque méthode de définition des variables d'environnement.
L'ordre de priorité (du plus élevé au plus bas) est le suivant :
- Défini en utilisant
docker compose run -e
dans la CLI. - Défini avec l'attribut
environment
ouenv_file
mais avec la valeur interpolée depuis votre shell ou un fichier d'environnement. (soit votre fichier.env
par défaut, ou avec l'argument--env-file
dans la CLI). - Défini en utilisant seulement l'attribut
environment
dans le fichier Compose. - Utilisation de l'attribut
env_file
dans le fichier Compose. - Défini dans une image de conteneur dans la
directive ENV.
Avoir n'importe quel paramètre
ARG
ouENV
dans unDockerfile
ne s'évalue que s'il n'y a pas d'entrée Docker Compose pourenvironment
,env_file
ourun --env
.
Exemple simple
Dans l'exemple suivant, une valeur différente pour la même variable d'environnement dans un fichier .env
et avec l'attribut environment
dans le fichier Compose :
$ cat ./webapp.env
NODE_ENV=test
$ cat compose.yaml
services:
webapp:
image: 'webapp'
env_file:
- ./webapp.env
environment:
- NODE_ENV=production
La variable d'environnement définie avec l'attribut environment
prend la priorité.
$ docker compose run webapp env | grep NODE_ENV
NODE_ENV=production
Exemple avancé
Le tableau suivant utilise VALUE
, une variable d'environnement définissant la version d'une image, comme exemple.
Comment fonctionne le tableau
Chaque colonne représente un contexte à partir duquel vous pouvez définir une valeur, ou substituer une valeur pour VALUE
.
Les colonnes Environnement de l'OS hôte
et fichier .env
sont listées uniquement à des fins d'illustration. En réalité, elles ne résultent pas en une variable dans le conteneur par elles-mêmes, mais en conjonction avec l'attribut environment
ou env_file
.
Chaque ligne représente une combinaison de contextes où VALUE
est défini, substitué, ou les deux. La colonne Résultat indique la valeur finale pour VALUE
dans chaque scénario.
# | docker compose run |
attribut environment |
attribut env_file |
Image ENV |
environnement OS hôte |
fichier .env |
Résultat | |
---|---|---|---|---|---|---|---|---|
1 | - | - | - | - | VALUE=1.4 |
VALUE=1.3 |
- | |
2 | - | - | VALUE=1.6 |
VALUE=1.5 |
VALUE=1.4 |
- | VALUE=1.6 |
|
3 | - | VALUE=1.7 |
- | VALUE=1.5 |
VALUE=1.4 |
- | VALUE=1.7 |
|
4 | - | - | - | VALUE=1.5 |
VALUE=1.4 |
VALUE=1.3 |
VALUE=1.5 |
|
5 | --env VALUE=1.8 |
- | - | VALUE=1.5 |
VALUE=1.4 |
VALUE=1.3 |
VALUE=1.8 |
|
6 | --env VALUE |
- | - | VALUE=1.5 |
VALUE=1.4 |
VALUE=1.3 |
VALUE=1.4 |
|
7 | --env VALUE |
- | - | VALUE=1.5 |
- | VALUE=1.3 |
VALUE=1.3 |
|
8 | - | - | VALUE |
VALUE=1.5 |
VALUE=1.4 |
VALUE=1.3 |
VALUE=1.4 |
|
9 | - | - | VALUE |
VALUE=1.5 |
- | VALUE=1.3 |
VALUE=1.3 |
|
10 | - | VALUE |
- | VALUE=1.5 |
VALUE=1.4 |
VALUE=1.3 |
VALUE=1.4 |
|
11 | - | VALUE |
- | VALUE=1.5 |
- | VALUE=1.3 |
VALUE=1.3 |
|
12 | --env VALUE |
VALUE=1.7 |
- | VALUE=1.5 |
VALUE=1.4 |
VALUE=1.3 |
VALUE=1.4 |
|
13 | --env VALUE=1.8 |
VALUE=1.7 |
- | VALUE=1.5 |
VALUE=1.4 |
VALUE=1.3 |
VALUE=1.8 |
|
14 | --env VALUE=1.8 |
- | VALUE=1.6 |
VALUE=1.5 |
VALUE=1.4 |
VALUE=1.3 |
VALUE=1.8 |
|
15 | --env VALUE=1.8 |
VALUE=1.7 |
VALUE=1.6 |
VALUE=1.5 |
VALUE=1.4 |
VALUE=1.3 |
VALUE=1.8 |
Explication des résultats
Résultat 1 : L'environnement local prend la priorité, mais le fichier Compose n'est pas configuré pour répliquer cela dans le conteneur, donc aucune variable de ce type n'est définie.
Résultat 2 : L'attribut env_file
dans le fichier Compose définit une valeur explicite pour VALUE
donc l'environnement du conteneur est défini en conséquence.
Résultat 3 : L'attribut environment
dans le fichier Compose définit une valeur explicite pour VALUE
, donc l'environnement du conteneur est défini en conséquence.
Résultat 4 : La directive ENV
de l'image déclare la variable VALUE
, et puisque le fichier Compose n'est pas configuré pour remplacer cette valeur, cette variable est définie par l'image.
Résultat 5 : La commande docker compose run
a le drapeau --env
défini avec une valeur explicite, et remplace la valeur définie par l'image.
Résultat 6 : La commande docker compose run
a le drapeau --env
défini pour répliquer la valeur de l'environnement. La valeur de l'OS hôte prend la priorité et est répliquée dans l'environnement du conteneur.
Résultat 7 : La commande docker compose run
a le drapeau --env
défini pour répliquer la valeur de l'environnement. La valeur du fichier .env
est sélectionnée pour définir l'environnement du conteneur.
Résultat 8 : L'attribut env_file
dans le fichier Compose est défini pour répliquer VALUE
de l'environnement local. La valeur de l'OS hôte prend la priorité et est répliquée dans l'environnement du conteneur.
Résultat 9 : L'attribut env_file
dans le fichier Compose est défini pour répliquer VALUE
de l'environnement local. La valeur du fichier .env
est sélectionnée pour définir l'environnement du conteneur.
Résultat 10 : L'attribut environment
dans le fichier Compose est défini pour répliquer VALUE
de l'environnement local. La valeur de l'OS hôte prend la priorité et est répliquée dans l'environnement du conteneur.
Résultat 11 : L'attribut environment
dans le fichier Compose est défini pour répliquer VALUE
de l'environnement local. La valeur du fichier .env
est sélectionnée pour définir l'environnement du conteneur.
Résultat 12 : Le drapeau --env
a une priorité plus élevée que les attributs environment
et env_file
et est défini pour répliquer VALUE
de l'environnement local. La valeur de l'OS hôte prend la priorité et est répliquée dans l'environnement du conteneur.
Résultats 13 à 15 : Le drapeau --env
a une priorité plus élevée que les attributs environment
et env_file
et définit donc la valeur.