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
- No funcionan entre archivos — Solo dentro del mismo archivo YAML
- Las listas no se mezclan — Se reemplazan completamente
- No todos los parsers soportan
<<— Es una extensión, no parte del estándar oficial