Saltar al contenido principal

Clase 04 — Anclas, Alias y Merge Keys

Las anclas (&) y alias (*) permiten reutilizar bloques de YAML para evitar duplicación. Es el equivalente a "variables" en YAML.

Ancla (&) y Alias (*) básicos

valores_default: &defaults
timeout: 30
retries: 3
log_level: info

servicio_api:
nombre: api
<<: *defaults # Inserta todo el contenido de defaults

servicio_worker:
nombre: worker
<<: *defaults # Mismo contenido reutilizado

Merge Key (<<)

base_container: &base
restart: unless-stopped
networks:
- app-net
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"

services:
frontend:
<<: *base
image: mi-app-front:latest
ports:
- "3000:3000"
backend:
<<: *base
image: mi-app-back:latest
ports:
- "8080:8080"

Sobrescribir valores del ancla

defaults: &defaults
timeout: 30
retries: 3
debug: false

produccion:
<<: *defaults
debug: false # Mantiene el default

desarrollo:
<<: *defaults
debug: true # Sobrescribe
timeout: 60 # Sobrescribe

Anclas con valores simples

imagen_base: &imagen nginx:1.25-alpine
replicas_default: &replicas 3

services:
web1:
image: *imagen
deploy:
replicas: *replicas
web2:
image: *imagen
deploy:
replicas: *replicas

Múltiples merge keys

logging_config: &logging
logging:
driver: json-file
options:
max-size: "10m"

healthcheck_config: &healthcheck
healthcheck:
interval: 30s
timeout: 10s
retries: 3

services:
api:
image: mi-api:latest
<<: [*logging, *healthcheck]
ports:
- "8080:8080"

Ejemplo: Docker Compose con DRY

version: "3.8"

x-common: &common
restart: unless-stopped
networks:
- app-network
logging:
driver: json-file
options:
max-size: "10m"

x-env-db: &env-db
DB_HOST: postgres
DB_PORT: "5432"
DB_NAME: app_db

services:
api:
<<: *common
build: ./api
ports:
- "8080:8080"
environment:
<<: *env-db
APP_PORT: "8080"

worker:
<<: *common
build: ./worker
environment:
<<: *env-db
QUEUE: default

postgres:
<<: *common
image: postgres:16-alpine
volumes:
- pg_data:/var/lib/postgresql/data

volumes:
pg_data:
networks:
app-network:

Ejemplo: GitLab CI con anclas

.docker_job: &docker_job
image: docker:24
services:
- docker:24-dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

.deploy_template: &deploy_template
image: bitnami/kubectl:latest
before_script:
- kubectl config set-cluster k8s --server=$K8S_SERVER
- kubectl config set-credentials deploy --token=$K8S_TOKEN
- kubectl config use-context default

build:
<<: *docker_job
stage: build
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

deploy_staging:
<<: *deploy_template
stage: deploy
script:
- kubectl set image deployment/mi-app api=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -n staging

deploy_production:
<<: *deploy_template
stage: deploy
script:
- kubectl set image deployment/mi-app api=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -n production
when: manual

Limitaciones

  1. No funcionan entre archivos — Solo dentro del mismo archivo YAML
  2. Las listas no se mezclan — Se reemplazan completamente
  3. No todos los parsers soportan << — Es una extensión, no parte del estándar oficial