# Extensiones




Las extensiones sirven para hacer tu archivo de Compose más eficiente y simplificar su mantenimiento. 
 
Utiliza el prefijo `x-` como un elemento de nivel superior para modularizar las configuraciones que quieras reutilizar. 
Compose ignora cualquier campo que comience con `x-`. Esta es la única excepción en la que Compose ignora silenciosamente los campos no reconocidos.


Las extensiones también se pueden utilizar con [anclajes y alias (anchors & aliases)](/reference/compose-file/extension/fragments/).

También se pueden utilizar dentro de cualquier estructura en un archivo de Compose donde no se esperen claves definidas por el usuario. 
Compose las utiliza para habilitar características experimentales, del mismo modo que los navegadores añaden soporte para [características de CSS personalizadas](https://www.w3.org/TR/2011/REC-CSS2-20110607/syndata.html#vendor-keywords)

## Ejemplo 1

```yml
x-custom:
  foo:
    - bar
    - zot

services:
  webapp:
    image: example/webapp
    x-foo: bar
```

```yml
service:
  backend:
    deploy:
      placement:
        x-aws-role: "arn:aws:iam::XXXXXXXXXXXX:role/foo"
        x-aws-region: "eu-west-3"
        x-azure-region: "france-central"
```

## Ejemplo 2

```yml
x-env: &env
  environment:
    - CONFIG_KEY
    - EXAMPLE_KEY
 
services:
  first:
    <<: *env
    image: my-image:latest
  second:
    <<: *env
    image: another-image:latest
```

En este ejemplo, las variables de entorno no pertenecen a ninguno de los servicios. Se han extraído por completo al campo de extensión `x-env`.
Esto define un nuevo nodo que contiene el campo environment. El anclaje YAML `&env` se utiliza para que ambos servicios puedan hacer referencia al valor del campo de extensión como `*env`.

## Ejemplo 3

```yml
x-function: &function
 labels:
   function: "true"
 depends_on:
   - gateway
 networks:
   - functions
 deploy:
   placement:
     constraints:
       - 'node.platform.os == linux'
services:
 # Node.js proporciona información del SO sobre el nodo (Host)
 nodeinfo:
   <<: *function
   image: functions/nodeinfo:latest
   environment:
     no_proxy: "gateway"
     https_proxy: $https_proxy
 # Utiliza `cat` para devolver la respuesta, es la función más rápida de ejecutar.
 echoit:
   <<: *function
   image: functions/alpine:health
   environment:
     fprocess: "cat"
     no_proxy: "gateway"
     https_proxy: $https_proxy
```

Los servicios `nodeinfo` y `echoit` incluyen la extensión `x-function` a través del anclaje `&function`, y luego establecen su imagen y entorno específicos. 

## Ejemplo 4 

Utilizando la [fusión de YAML (YAML merge)](https://yaml.org/type/merge.html) también es posible utilizar múltiples extensiones y compartir e invalidar atributos adicionales para necesidades específicas:

```yml
x-environment: &default-environment
  FOO: BAR
  ZOT: QUIX
x-keys: &keys
  KEY: VALUE
services:
  frontend:
    image: example/webapp
    environment: 
      << : [*default-environment, *keys]
      YET_ANOTHER: VARIABLE
```

> [!NOTE]
>
> La [fusión de YAML](https://yaml.org/type/merge.html) solo se aplica a los mapeos y no se puede utilizar con secuencias. 
>
> En el ejemplo anterior, las variables de entorno se declaran utilizando la sintaxis de mapeo `FOO: BAR`, mientras que la sintaxis de secuencia `- FOO=BAR` solo es válida cuando no hay fragmentos involucrados.

## Notas históricas informativas

Esta sección es informativa. En el momento de redactar este documento, se conoce la existencia de los siguientes prefijos:

| Prefijo     | Proveedor/Organización |
| ----------- | ---------------------- |
| docker      | Docker                 |
| kubernetes  | Kubernetes             |

## Especificación de valores de bytes

Los valores expresan un valor de bytes como una cadena en formato `{cantidad}{unidad_de_byte}`:
Las unidades admitidas son `b` (bytes), `k` o `kb` (kilobytes), `m` o `mb` (megabytes) y `g` o `gb` (gigabytes).

```text
    2b
    1024kb
    2048k
    300m
    1gb
```

## Especificación de duraciones

Los valores expresan una duración como una cadena en el formato `{valor}{unidad}`.
Las unidades admitidas son `us` (microsegundos), `ms` (milisegundos), `s` (segundos), `m` (minutos) y `h` (horas).
Los valores pueden combinar múltiples valores sin separador.

```text
  10ms
  40s
  1m30s
  1h5m30s20ms
```

