Profiles, overrides y Watch en Docker Compose | Nicolás Garzón
Texto
Copiar modelo base estable
+ variación pequeña y explícita
→ configuración efectiva validadaEl riesgo aparece cuando las combinaciones dejan de ser comprensibles. La fuente de verdad operativa es el resultado de docker compose config, no la lectura aislada de un solo archivo.
Un profile activa services opcionales:
YAML
Copiar services :
api :
image : my- api
adminer :
image : adminer
profiles : [ debug]
mailpit :
image : axllent/mailpit
profiles : [ development] Bash
Copiar docker compose --profile debug up -d
docker compose --profile development up -d Services sin profile forman parte del modelo normal. Un service con profile no inicia salvo activación o selección explícita según reglas de Compose.
herramientas de debugging;
UI de database local;
simuladores de email;
observabilidad opcional;
jobs administrativos;
componentes GPU;
extras de demo.
No uses profiles para mantener dos arquitecturas incompatibles dentro del mismo archivo. Si producción y desarrollo son sistemas radicalmente distintos, revisa el diseño.
Un service activo no debe depender accidentalmente de otro desactivado. Valida combinaciones:
Bash
Copiar docker compose --profile debug configPrueba cada profile soportado en CI. Una configuración que solo funciona cuando alguien recuerda dos flags es frágil.
Bash
Copiar docker compose \
-f compose.yaml \
-f compose.development.yaml \
up -d El segundo archivo modifica el modelo base.
YAML
Copiar services :
api :
image : registry.example.com/api@sha256: ...
networks : [ backend] compose.development.yaml:
YAML
Copiar services :
api :
build :
context : .
target : development
command : npm run dev
ports :
- "3000:3000"
volumes :
- .: /app
- node- modules: /app/node_modules
volumes :
node- modules: La variación local añade build, hot reload, port y mounts sin copiar database, networks y healthchecks completos.
Maps, listas y valores escalares no siempre se combinan igual. Algunas propiedades se reemplazan; otras se agregan o tienen reglas especiales.
Nunca infieras el resultado solo visualmente:
Bash
Copiar docker compose \
-f compose.yaml \
-f compose.production.yaml \
config
ports;
volumes;
environment;
command;
entrypoint;
networks;
healthcheck;
labels;
secrets.
Un array heredado puede conservar una publicación o mount que pretendías retirar.
Un override saludable contiene solo diferencias:
YAML
Copiar services :
api :
environment :
LOG_LEVEL : debugUn override que repite 90 % del base inevitablemente diverge.
base: contrato común;
development: feedback local;
test: aislamiento y datos efímeros;
production: images por digest, límites y seguridad.
YAML
Copiar services :
api :
image : "${API_IMAGE:?API_IMAGE required}"
environment :
LOG_LEVEL : "${LOG_LEVEL:-info}" La interpolación ocurre antes o durante la resolución del modelo según Compose. No confundas el .env utilizado para interpolar con env_file enviado al container.
Valida valores obligatorios usando sintaxis de error cuando sea apropiado.
Watch observa cambios y ejecuta acciones como sincronizar o reconstruir según configuración y versión.
YAML
Copiar services :
api :
build :
context : .
target : development
develop :
watch :
- action : sync
path : ./src
target : /app/src
- action : rebuild
path : ./package- lock.jsonTexto
Copiar cambio en src
→ sync
→ hot reload
cambio en lockfile
→ rebuild
→ nueva image/container
source interpretado;
templates;
assets;
cambios que el runtime recarga.
lockfile;
Dockerfile;
paquete de sistema;
código compilado durante build;
configuración incorporada a la image;
dependencia nativa.
Sincronizar un lockfile no instala dependencias. Rebuild o una acción explícita debe actualizar el entorno.
simple;
refleja filesystem completo;
puede ser lento en Desktop;
introduce permisos y diferencias del host.
sincroniza paths seleccionados;
puede evitar node_modules del host;
expresa rebuilds;
depende de tooling moderno;
necesita reglas cuidadosas.
Elige por rendimiento y claridad, no por novedad.
.git;
.env real;
node_modules del host;
build outputs recursivos;
logs;
caches;
secretos.
Evita loops donde la app genera un archivo que Watch vuelve a sincronizar y dispara otra acción.
Texto
Copiar images, health, networks, volumes y contratosTexto
Copiar build target dev + Watch + debug portTexto
Copiar profiles de dependencies + volumes efímeros + no ports públicosTexto
Copiar digests + read_only + límites + logging + sin bind mountsBash
Copiar docker compose -f compose.yaml -f compose.development.yaml config --quiet
docker compose -f compose.yaml -f compose.production.yaml config --quiet Producción publica una database por una lista combinada inesperadamente.
String y lista pueden producir un resultado distinto al esperado.
Un job o herramienta no existe y el error parece de DNS.
Módulos nativos de macOS terminan en Linux.
El output del build está dentro del path observado.
Overrides antiguos dejan de ser válidos y silenciosamente modifican otro campo.
Corrección: base + diferencias pequeñas.
Consecuencia: merge e interpolación inesperados.
Consecuencia: stack incompleto por omitir un flag.
Consecuencia: secretos, caches y bajo rendimiento.
Consecuencia: runtime mutable y no trazable.
Corrección: imágenes inmutables.
Profiles activan services opcionales.
Overrides deben expresar diferencias, no duplicar stacks.
Merge puede sorprender: inspecciona la configuración efectiva.
Watch sincroniza source o reconstruye según el tipo de cambio.
Desarrollo mutable y producción inmutable tienen objetivos distintos.
Comprueba lo aprendido
Diseña profiles para debug y observabilidad local.
¿Qué revisarías después de combinar base y production override?
¿Qué cambios deben sincronizarse y cuáles reconstruir?
¿Por qué no montar node_modules del host?
¿Cómo evitarías que dos archivos Compose diverjan?
Secrets y configuración en Compose , donde la separación declarativa no debe confundirse con un secret manager completo.