5 astuces : compose.yml
Tu vas découvrir 5 astuces utiles lorsque tu crées un fichier compose.yml. 😎
Astuce 1 : Centraliser les variables sensibles (mots de passe, etc.)
Pourquoi centraliser les variables sensibles ?
C'est très simple !
Pour plus de flexibilité et de sécurité, il est préférable d’utiliser des variables d'environnement pour stocker les informations sensibles. Ainsi, elles ne seront pas présentes dans le fichier compose.yml de Docker.
Comment utiliser les variables d'environnement dans Docker ?
Mauvais exemple
Il ne faut surtout pas procéder de cette façon :
environment:
POSTGRES_PASSWORD: supersecret
Bon exemple
Il est préférable d'utiliser des variables d'environnement. Voici un exemple :
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
Ensuite, dans un fichier .env
, ajoutez le nom de la variable ainsi que son contenu : le mot de passe.
POSTGRES_PASSWORD=supersecret
Ajoutez .env
à votre .gitignore
pour éviter les fuites d’infos sensibles.

Voici l'arborescence adapté à l'exemple :
test/
|-- compose.yml
|-- .env
⚠️ Attention, le fichier .env
est un fichier caché. Par conséquent, il peut être invisible. Utilise les options adéquates ou un éditeur de code pour l’afficher.
Astuce 2 : Réutiliser des blocs grâce aux ancres
Les ancres YML
Pour information, les ancres ne sont pas une fonctionnalité propre à Docker, mais une fonctionnalité des fichiers YML.
Pourquoi utiliser des ancres ?
Les ancres permettent de réutiliser des blocs que l’on répète plusieurs fois dans le fichier compose.yml
.
Comment créer des ancres ?
Pour bien comprendre, nous allons utiliser un exemple.
Nous souhaitons répéter le bloc suivant trois fois :
image: nginx:latest
networks:
- nginx_network
Préparation de l'ancre
Pour préparer le bloc, il faut utiliser la structure suivante :
x-serveurs: &serveurs
image: nginx:latest
networks:
- nginx_network
Alors, x-serveurs
est une clé choisie. Le préfixe x-
est une convention de nommage qu’il faut respecter.
Et &serveurs
est l’ancre à utiliser. Le symbole &
permet de définir l’ancre, et serveurs
en est le nom.
Utiliser l'ancre
Pour utiliser l'ancre, il faut insérer dans le fichier compose.yml
l'expression suivante :
<<: *serveurs
Et pour mieux comprendre, voici l’exemple complet :
x-serveurs: &serveurs
image: nginx:latest
networks:
- nginx_network
services:
app1:
<<: *serveurs
ports:
- "81:80"
app2:
<<: *serveurs
ports:
- "82:80"
app3:
<<: *serveurs
ports:
- "83:80"
networks:
nginx_network:
driver: bridge
Ce code équivaut à :
services:
app1:
image: nginx:latest
networks:
- nginx_network
ports:
- "81:80"
app2:
image: nginx:latest
networks:
- nginx_network
ports:
- "82:80"
app3:
image: nginx:latest
networks:
- nginx_network
ports:
- "83:80"
networks:
nginx_network:
driver: bridge
Grâce aux ancres, l’espace est optimisé et, en cas de modification, il suffit de changer uniquement le contenu de l’ancre. 😉
Si vous faites un docker compose up
, trois conteneurs seront lancés, basés sur l’image nginx:latest
et connectés au réseau nginx_network
.
Astuce 3 : Vérifier la configuration du fichier compose.yml
Tu peux simplement, vérifier la configuration de ton fichier compose.yml
grâce à la commande suivante : docker compose config
.
Nous allons créer un compose.yml
pour l'exemple :
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
networks:
- webnet
app:
image: php:latest
volumes:
- program:/var/www/html
networks:
- webnet
networks:
webnet:
driver: bridge
volumes:
program:
ℹ️ Inutile de lancer ce `compose.yml`, car il n’a pas été testé et pourrait ne pas fonctionner. Ce fichier a uniquement été créé à des fins d’observation.
Maintenant, on lance la commande pour vérifier la configuration :
docker compose config
Et voici le résultat :
services:
app:
image: php:latest
networks:
webnet: null
volumes:
- type: volume
source: program
target: /var/www/html
volume: {}
web:
image: nginx:latest
networks:
webnet: null
ports:
- mode: ingress
target: 80
published: "80"
protocol: tcp
volumes:
- type: bind
source: /Users/henrique/Documents/apps/lab/Test/nginx.conf
target: /etc/nginx/nginx.conf
bind:
create_host_path: true
networks:
webnet:
name: test_webnet
driver: bridge
volumes:
program:
name: test_program
Cela nous affiche des détails intéressants :
-
Lignes 17 à 18 : On voit clairement le port utilisé par notre conteneur ainsi que celui exposé. Il s’agit du mappage entre le port du conteneur et celui de la machine locale.
-
Lignes 6 à 10 et 20 à 25 : On identifie un volume mappé et un autre managé.
Astuce 4 : Utiliser plusieurs configurations
Pourquoi utiliser plusieurs configurations ?
Cela permet d’ajouter des règles sans modifier la configuration principale. C’est très utile lorsqu’on utilise Docker en mode développement d’application.
C’est également pratique lorsqu’on souhaite une configuration spécifique pour le passage en production.
Créer une configuration compose.override.yml
et compose.prod.yml
Le fichier compose.override.yml
a une particularité : il est automatiquement pris en compte lorsque l’on exécute la commande docker compose config
.
Nous allons utiliser un exemple pour bien comprendre.
Il nous faut de fichiers :
test/
|-- compose.yml
|-- compose.override.yml
compose.yml
Dans le fichier compose.yml
tapez les règles suivantes :
services:
web:
image: nginx:latest
compose.override.yml
Dans le fichier compose.override.yml
insérez les informations suivantes :
services:
web:
ports:
- "8000:80"
Tapez la commande qui permet d'analyser la configuration de notre compose.yml
.
docker compose config
Et voici le résultat :
name: test
services:
web:
image: nginx:latest
networks:
default: null
ports:
- mode: ingress
target: 80
published: "8000"
protocol: tcp
networks:
default:
name: test_default
Les deux fichiers ont été pris en compte. 👍 Cette mécanique pourra être utile dans certains cas.
compose.prod.yml
Une configuration spécifique pourra être utilisée en production. On la nommera compose.prod.yml
.
✅ Il est possible d’utiliser un autre nom, mais en général, on utilise `compose.prod.yml` pour la production.
Ce fichier ne sera pas pris en compte automatiquement. Nous allons donc procéder autrement pour gérer les configurations, en utilisant l’option -f
.
Mais avant cela, je rappelle l’arborescence.
test/
|-- compose.yml
|-- compose.override.yml
|-- compose.prod.yml
Dans le fichier compose.prod.yml
j'insère ces règles :
services:
web:
ports:
- "80:80"
Maintenant, je vais utiliser la commande suivante :
docker compose -f compose.yml -f compose.prod.yml config
J’utilise donc l’option -f
. Cela me permet d’indiquer quels fichiers doivent être pris en compte.
Et vous avez certainement remarqué que compose.override.yml
n’est pas utilisé dans ce cas.
Voici le résultat :
name: test
services:
web:
image: nginx:latest
networks:
default: null
ports:
- mode: ingress
target: 80
published: "80"
protocol: tcp
networks:
default:
name: test_default
Comme vous pouvez le constater, le mappage de ports défini dans le fichier compose.prod.yml
a bien été pris en compte.
Astuce 5 : Utiliser les profils pour gérer des services conditionnels
Qu'est-ce qu'un profils ?
Un profil est une étiquette que l’on associe à un ou plusieurs services dans le fichier compose.yml
. Lorsqu’on lance Docker Compose, on peut choisir d’activer un profil particulier pour inclure ou exclure certains services. 😮
Comment définir un profil ?
Dans votre fichier compose.yml
, vous pouvez ajouter la clé profiles à un ou plusieurs services.
Voici la syntaxe de base :
services:
webdev:
image: nginx:latest
ports:
- "8000:80"
profiles:
- dev
webprod:
image: nginx:latest
ports:
- "80:80"
profiles:
- prod
N'oubliez pas de supprimer les autres fichier :
test/
|-- compose.yml
Activer un profil !
Pour activer un profil, il faut utiliser l'option --profile
:
Profil dev
docker compose --profile dev config
Voici le résultat pour dev
:
name: test
services:
webdev:
profiles:
- dev
image: nginx:latest
networks:
default: null
ports:
- mode: ingress
target: 80
published: "8000"
protocol: tcp
networks:
default:
name: test_default
Profil prod
docker compose --profile prod config
Voici le résultat pour prod
:
name: test
services:
webprod:
profiles:
- prod
image: nginx:latest
networks:
default: null
ports:
- mode: ingress
target: 80
published: "80"
protocol: tcp
networks:
default:
name: test_default
Informations supplémentaires
Pour les experts
Ces astuces sont destinées à ceux qui maîtrisent déjà Docker. Si vous débutez, je vous invite d’abord à vous former aux bases de Docker.
Possibilité d'utiliser docker compose up
Pour l’astuce 4 et l’astuce 5, il est possible d’utiliser directement docker compose up
au lieu de vérifier la configuration. Le principe reste le même.