Étendre votre fichier Compose
L'attribut
extends de Docker Compose
vous permet de partager des configurations communes entre différents fichiers, ou même différents
projets entièrement.
L'extension de services est utile si vous avez plusieurs services qui réutilisent un ensemble commun
d'options de configuration. Avec extends vous pouvez définir un ensemble commun
d'options de service en un endroit et y faire référence de n'importe où. Vous pouvez faire référence à
un autre fichier Compose et sélectionner un service que vous voulez également utiliser dans votre propre
application, avec la possibilité de remplacer certains attributs pour vos propres besoins.
ImportantQuand vous utilisez plusieurs fichiers Compose, vous devez vous assurer que tous les chemins dans les fichiers sont relatifs au fichier Compose de base (c'est-à-dire le fichier Compose dans votre dossier de projet principal). Ceci est requis parce que les fichiers d'extension n'ont pas besoin d'être des fichiers Compose valides. Les fichiers d'extension peuvent contenir de petits fragments de configuration. Suivre quel fragment d'un service est relatif à quel chemin est difficile et déroutant, donc pour garder les chemins plus faciles à comprendre, tous les chemins doivent être définis relativement au fichier de base.
Comment ça fonctionne
Étendre des services depuis un autre fichier
Prenez l'exemple suivant :
services:
web:
extends:
file: common-services.yml
service: webappCeci indique à Compose de réutiliser uniquement les propriétés du service webapp
défini dans le fichier common-services.yml. Le service webapp lui-même ne fait pas partie du projet final.
Si common-services.yml
ressemble à ceci :
services:
webapp:
build: .
ports:
- "8000:8000"
volumes:
- "/data"Vous obtenez exactement le même résultat que si vous écriviez
compose.yaml avec les mêmes valeurs de configuration build, ports, et volumes
définies directement sous web.
Pour inclure le service webapp dans le projet final lors de l'extension de services depuis un autre fichier, vous devez explicitement inclure les deux services dans votre fichier Compose actuel. Par exemple (notez que c'est un exemple non normatif) :
services:
web:
build: alpine
command: echo
extends:
file: common-services.yml
service: webapp
webapp:
extends:
file: common-services.yml
service: webappAlternativement, vous pouvez utiliser include.
Étendre des services dans le même fichier
Si vous définissez des services dans le même fichier Compose et étendez un service depuis un autre, à la fois le service original et le service étendu feront partie de votre configuration finale. Par exemple :
services:
web:
build: alpine
extends: webapp
webapp:
environment:
- DEBUG=1Étendre des services dans le même fichier et depuis un autre fichier
Vous pouvez aller plus loin et définir, ou redéfinir, la configuration localement dans
compose.yaml :
services:
web:
extends:
file: common-services.yml
service: webapp
environment:
- DEBUG=1
cpu_shares: 5
important_web:
extends: web
cpu_shares: 10Exemple supplémentaire
Étendre un service individuel est utile quand vous avez plusieurs services qui ont une configuration commune. L'exemple ci-dessous est une application Compose avec deux services, une application web et un worker de queue. Les deux services utilisent la même base de code et partagent de nombreuses options de configuration.
Le fichier common.yaml définit la configuration commune :
services:
app:
build: .
environment:
CONFIG_FILE_PATH: /code/config
API_KEY: xxxyyy
cpu_shares: 5Le compose.yaml définit les services concrets qui utilisent la configuration
commune :
services:
webapp:
extends:
file: common.yaml
service: app
command: /code/run_web_app
ports:
- 8080:8080
depends_on:
- queue
- db
queue_worker:
extends:
file: common.yaml
service: app
command: /code/run_worker
depends_on:
- queueExceptions et limitations
volumes_from et depends_on ne sont jamais partagés entre les services utilisant
extends. Ces exceptions existent pour éviter les dépendances implicites ; vous
définissez toujours volumes_from localement. Ceci assure que les dépendances entre services sont
clairement visibles lors de la lecture du fichier actuel. Définir ces éléments localement assure également
que les changements au fichier référencé ne cassent rien.
extends est utile si vous avez seulement besoin qu'un seul service soit partagé et que vous êtes
familier avec le fichier que vous étendez, pour que vous puissiez ajuster la
configuration. Mais ce n'est pas une solution acceptable quand vous voulez réutiliser
les configurations non familières de quelqu'un d'autre et que vous ne connaissez pas ses propres
dépendances.
Chemins relatifs
Lors de l'utilisation d'extends avec un attribut file qui pointe vers un autre dossier, les chemins relatifs
déclarés par le service étendu sont convertis pour qu'ils pointent toujours vers le
même fichier quand ils sont utilisés par le service d'extension. Ceci est illustré dans l'exemple suivant :
Fichier Compose de base :
services:
webapp:
image: example
extends:
file: ../commons/compose.yaml
service: baseLe fichier commons/compose.yaml :
services:
base:
env_file: ./container.envLe service résultant fait référence au fichier container.env original
dans le répertoire commons. Ceci peut être confirmé avec docker compose config
qui inspecte le modèle réel :
services:
webapp:
image: example
env_file:
- ../commons/container.env