Extender tu archivo de Compose
El
atributo extends de Docker Compose permite compartir configuraciones comunes entre diferentes archivos, o incluso entre proyectos completamente distintos.
Extender servicios resulta útil si tienes varios servicios que reutilizan un conjunto común de opciones de configuración. Con extends puedes definir un conjunto común de opciones de servicio en un solo lugar y hacer referencia a él desde cualquier sitio. Puedes hacer referencia a otro archivo de Compose y seleccionar un servicio que también desees utilizar en tu propia aplicación, con la capacidad de sobrescribir algunos atributos para satisfacer tus necesidades.
ImportantCuando utilices múltiples archivos de Compose, debes asegurarte de que todas las rutas en los archivos sean relativas al archivo de Compose base (es decir, el archivo de Compose en la carpeta de tu proyecto principal). Esto es necesario porque los archivos extendidos no tienen por qué ser archivos de Compose válidos. Los archivos extendidos pueden contener pequeños fragmentos de configuración. Realizar el seguimiento de qué fragmento de un servicio es relativo a qué ruta es difícil y confuso, por lo que para mantener las rutas más fáciles de entender, todas deben definirse en relación con el archivo base.
Note
extendsno es compatible cuando se realiza un despliegue condocker stack deploy. Ejecutardocker stack configen un archivo de Compose que utilizaextendsdevuelve el error:Configuration contains forbidden properties.
Cómo funciona el atributo extends
Extender servicios desde otro archivo
Toma el siguiente ejemplo:
services:
web:
extends:
file: common-services.yml
service: webappEsto indica a Compose que reutilice únicamente las propiedades del servicio webapp definido en el archivo common-services.yml. El servicio webapp en sí mismo no forma parte del proyecto final.
Si common-services.yml se ve así:
services:
webapp:
build: .
ports:
- "8000:8000"
volumes:
- "/data"Obtienes exactamente el mismo resultado que si hubieras escrito compose.yaml con los mismos valores de configuración de build, ports y volumes definidos directamente bajo web.
Para incluir el servicio webapp en el proyecto final al extender servicios desde otro archivo, necesitas incluir explícitamente ambos servicios en tu archivo de Compose actual. Por ejemplo (esto es solo con fines ilustrativos):
services:
web:
build: ./alpine
command: echo
extends:
file: common-services.yml
service: webapp
webapp:
extends:
file: common-services.yml
service: webappComo alternativa, puedes utilizar include.
Extender servicios dentro del mismo archivo
Si defines servicios en el mismo archivo de Compose y extiendes un servicio de otro, tanto el servicio original como el servicio extendido formarán parte de tu configuración final. Por ejemplo:
services:
web:
build: ./alpine
extends: webapp
webapp:
environment:
- DEBUG=1Extender servicios dentro del mismo archivo y desde otro archivo
Puedes ir más allá y definir, o redefinir, la configuración localmente en compose.yaml:
services:
web:
extends:
file: common-services.yml
service: webapp
environment:
- DEBUG=1
cpu_shares: 5
important_web:
extends: web
cpu_shares: 10Ejemplo adicional
Extender un servicio individual resulta útil cuando tienes múltiples servicios que comparten una configuración común. El siguiente ejemplo muestra una aplicación de Compose con dos servicios: una aplicación web y un procesador de cola (queue worker). Ambos servicios utilizan la misma base de código y comparten muchas opciones de configuración.
El archivo common.yaml define la configuración común:
services:
app:
build: .
environment:
CONFIG_FILE_PATH: /code/config
API_KEY: xxxyyy
cpu_shares: 5El archivo compose.yaml define los servicios específicos que utilizan la configuración común:
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:
- queueRutas relativas
Al usar extends con un atributo file que apunta a otra carpeta, las rutas relativas declaradas por el servicio que se está extendiendo se convierten para que sigan apuntando al mismo archivo cuando son utilizadas por el servicio que lo extiende. Esto se ilustra en el siguiente ejemplo:
Archivo de Compose base:
services:
webapp:
image: example
extends:
file: ../commons/compose.yaml
service: baseEl archivo commons/compose.yaml:
services:
base:
env_file: ./container.envEl servicio resultante hace referencia al archivo original container.env dentro del directorio commons. Esto se puede confirmar con docker compose config que inspecciona el modelo real:
services:
webapp:
image: example
env_file:
- ../commons/container.env