# Extender tu archivo de Compose


El [atributo `extends`](/reference/compose-file/services/#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.

> [!IMPORTANT]
>
> Cuando 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]
>
> `extends` no es compatible cuando se realiza un despliegue con `docker stack deploy`. Ejecutar `docker stack config` en un archivo de Compose que utiliza `extends` devuelve el error: `Configuration contains forbidden properties`.

## Cómo funciona el atributo `extends`

### Extender servicios desde otro archivo

Toma el siguiente ejemplo:

```yaml
services:
  web:
    extends:
      file: common-services.yml
      service: webapp
```

Esto 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í:

```yaml
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):

```yaml
services:
  web:
    build: ./alpine
    command: echo
    extends:
      file: common-services.yml
      service: webapp
  webapp:
    extends:
      file: common-services.yml
      service: webapp
```

Como alternativa, puedes utilizar [include](/compose/how-tos/multiple-compose-files/extends/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:

```yaml
services:
  web:
    build: ./alpine
    extends: webapp
  webapp:
    environment:
      - DEBUG=1
```

### Extender 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`:

```yaml
services:
  web:
    extends:
      file: common-services.yml
      service: webapp
    environment:
      - DEBUG=1
    cpu_shares: 5

  important_web:
    extends: web
    cpu_shares: 10
```

## Ejemplo 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:

```yaml
services:
  app:
    build: .
    environment:
      CONFIG_FILE_PATH: /code/config
      API_KEY: xxxyyy
    cpu_shares: 5
```

El archivo `compose.yaml` define los servicios específicos que utilizan la configuración común:

```yaml
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:
      - queue
```

## Rutas 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:

```yaml
services:
  webapp:
    image: example
    extends:
      file: ../commons/compose.yaml
      service: base
```

El archivo `commons/compose.yaml`:

```yaml
services:
  base:
    env_file: ./container.env
```

El 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:

```yaml
services:
  webapp:
    image: example
    env_file:
      - ../commons/container.env
```

## Información de referencia

- [`extends`](/reference/compose-file/services/#extends)

