La idea en 30 segundos
Containerizing Agents es un enfoque arquitectónico en el que un agente se ejecuta como un servicio aislado y reproducible dentro de un contenedor.
No es solo un Dockerfile. Es un límite controlado entre el código del agente y el entorno de producción: dependencias, config, secretos, recursos, health checks y actualizaciones del servicio.
Cuándo se necesita: cuando el agente no corre solo en local, sino en un servicio real con carga, actualizaciones y requisitos de confiabilidad.
Un LLM no debe controlar la infraestructura por sí solo. La capa de contenedor impone límites de ejecución para que el agente sea estable después del deploy.
Problema
En local, un agente suele funcionar bien, pero después del deploy empiezan fallos inestables.
Problemas típicos sin una containerización gobernada:
- distintos entornos dan comportamientos distintos para el mismo código;
- dependencias o bibliotecas del sistema difieren entre máquinas;
- secretos acaban por accidente en el image o en logs;
- no hay límites claros de CPU/memoria, por lo que aparece OOMKill;
- no hay checks de readiness/health y el tráfico va a una instancia "no saludable";
- rollout y rollback se hacen de forma manual y lenta.
Como resultado, el sistema parece "funcionar", pero resiste mal picos, actualizaciones y fallos parciales.
Solución
Añadir Containerizing Agents como una capa operativa explícita para ejecutar el agente en producción.
Esta capa fija:
- un image reproducible;
- config de runtime y secretos fuera del image;
- límites de recursos y comportamiento de timeout;
- checks de health/readiness;
- rollout/rollback controlado.
Analogía: como un contenedor estandarizado para transporte de carga.
Importa no solo lo que va dentro, sino también reglas estándar de transporte, seguridad y verificación.
Containerizing Agents hace lo mismo y vuelve predecible la ejecución del agente en cualquier entorno.
Cómo funciona Containerizing Agents
Containerizing Agents es una capa gobernada entre el código del agente y la plataforma de ejecución que define cómo se construye, inicia, verifica y actualiza el agente.
Resumen del flujo completo: Build → Configure → Run → Observe → Recover
Build
El código del agente y sus dependencias se empaquetan en un image reproducible del contenedor.
Configure
Runtime recibe env config, secretos, budgets y allowlist fuera del image.
Run
El agente se ejecuta en un proceso aislado con límites de CPU/memoria y comportamiento de timeout.
Observe
La plataforma lee health checks, métricas, logs y stop reasons.
Recover
Si sube la error-rate, el sistema hace rollback, restart o activa un kill switch para herramientas riesgosas.
Este ciclo reduce el caos de infraestructura y hace que el comportamiento del agente sea predecible bajo carga.
En código se ve así
FROM python:3.12.2-slim AS builder
WORKDIR /build
COPY requirements.lock ./
RUN pip install --no-cache-dir --require-hashes -r requirements.lock --prefix=/install
FROM python:3.12.2-slim AS runner
RUN useradd --create-home --uid 10001 appuser
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
COPY --from=builder /install /usr/local
COPY . .
USER appuser
EXPOSE 8080
CMD ["python", "main.py"]
.dockerignore también es crítico: normalmente se excluyen .git, __pycache__, .venv, tests, artefactos locales y .env.
import os
class ContainerizedAgentApp:
def __init__(self, agent_runtime):
self.agent_runtime = agent_runtime
self.max_steps = int(os.getenv("AGENT_MAX_STEPS", "20"))
self.max_seconds = int(os.getenv("AGENT_MAX_SECONDS", "45"))
self.max_tool_calls = int(os.getenv("AGENT_MAX_TOOL_CALLS", "10"))
def run(self, task: str):
# La capa de contenedor aplica budgets de runtime de forma obligatoria.
result = self.agent_runtime.run(
task=task,
max_steps=self.max_steps,
max_tool_calls=self.max_tool_calls,
max_seconds=self.max_seconds,
)
return {
"ok": result.get("ok", False),
"result": result.get("result"),
"reason_code": result.get("reason_code", "runtime_unknown"),
}
def readiness(self):
# Verificación de que el servicio está listo para recibir tráfico.
return {"ok": True}
def liveness(self):
# Verificación de que el proceso no está colgado.
return {"ok": True}
Cómo se ve durante la ejecución
Solicitud: "Actualiza el estado de 500 pedidos y genera un informe"
Step 1
Ingress: envía tráfico solo a contenedores ready
Agent Container: inicia con env config y secretos de runtime
Agent Runtime: verifica budgets (steps/tool_calls/time)
Step 2
Tool Execution Layer: llama API con timeout y política de retry
Observability: escribe metrics + trace + reason_code
Step 3
Deployment Control: detecta crecimiento de error-rate
Deployment Control: detiene rollout y hace rollback al image anterior
Containerizing Agents no cambia la lógica del agente. La vuelve predecible en un entorno de ejecución real.
Cuándo encaja y cuándo no
Containerizing Agents se necesita donde el agente funciona como servicio de producción y debe soportar actualizaciones y carga.
Encaja
| Situación | Por qué Containerizing Agents encaja | |
|---|---|---|
| ✅ | El agente corre en producción y tiene SLA | El aislamiento y los health checks mejoran previsibilidad y estabilidad. |
| ✅ | Se necesitan deploys seguros y rollback rápido | Las versiones de image y el control de rollout permiten actualizar el servicio con más seguridad. |
| ✅ | Existe riesgo de OOM, timeout y carga pico | Los límites de recursos y budgets de runtime reducen caídas inestables. |
No encaja
| Situación | Por qué Containerizing Agents no encaja | |
|---|---|---|
| ❌ | Prototipo local de un solo uso sin carga de producción | La containerización completa puede ser excesiva para un experimento corto. |
| ❌ | No hay monitoreo, proceso de rollout ni soporte del servicio | La containerización no reemplaza observability, procesos SRE/DevOps ni disciplina de release. |
En escenarios simples, a veces basta la ejecución local:
result = local_agent.run(task)
Problemas y fallos típicos
| Problema | Qué pasa | Cómo prevenirlo |
|---|---|---|
| Secretos en el image | Las claves se filtran por registry o logs | Secretos solo mediante secret manager y runtime injection |
| Sin límites de recursos | Una solicitud pico dispara OOMKill y cascading failures | CPU/Memory requests+limits, budgets y backpressure |
| Mutable image / dependencias sin pinning | Hoy el contenedor arranca estable, mañana el mismo build se comporta distinto | Pinned versions, immutable tags/digests y reproducible builds |
| Readiness mal configurado | El tráfico entra al contenedor antes de estar totalmente listo | Checks separados de liveness/readiness y warm-up antes de recibir tráfico |
| Tormenta de reintentos (retry storm) | Los reintentos multiplican la carga sobre la API al mismo tiempo | Retry acotado, jitter, circuit breaker y límites globales |
| Rollout fallido sin rollback rápido | La nueva versión empeora la error-rate de todo el servicio | Canary rollout, alertas SLO y rollback automático |
La mayoría de estos fallos no se resuelven con "magia Docker", sino con reglas operativas explícitas alrededor del contenedor.
Cómo se combina con otros patrones
Containerizing Agents es la base de infraestructura para el funcionamiento estable de otras capas arquitectónicas.
- Agent Runtime — Runtime se ejecuta dentro del contenedor y recibe límites estables.
- Tool Execution Layer — las reglas de red y timeout para herramientas se definen junto con el arranque en contenedor.
- Memory Layer — el contenedor normalmente no debe guardar memoria de largo plazo en local; el memory store debe ser externo.
- Policy Boundaries — los policy checks siguen siendo una capa separada, pero el contenedor garantiza ejecución controlada.
- Orchestration Topologies — cada agente en una topología suele ejecutarse como un servicio de contenedor separado.
- Hybrid Workflow Agent — los commits de workflow y los pasos del agente escalan mejor cuando ambos se ejecutan en contenedores controlados.
- Human-in-the-Loop Architecture — los servicios de approval y los contenedores del agente deben tener timeout/SLA alineados para un flujo de revisión estable.
En otras palabras:
- Containerizing Agents define dónde y dentro de qué límites se ejecuta el agente
- Otras capas arquitectónicas definen qué hace el agente y qué acciones están permitidas
En resumen
Containerizing Agents:
- aísla al agente en un entorno de ejecución reproducible
- separa code/image de config de runtime y secretos
- añade límites de recursos, health checks y control de rollout
- hace más estable el comportamiento en producción bajo carga
FAQ
Q: ¿La containerización garantiza que el agente no se caiga?
A: No. No elimina todos los errores, pero reduce mucho el caos del entorno y simplifica la recuperación.
Q: ¿Se pueden guardar secretos en Dockerfile o image?
A: Mejor no. Los secretos deben llegar solo en runtime mediante un gestor de secretos.
Q: ¿Qué es más importante primero: Kubernetes o límites correctos de runtime?
A: Para la mayoría de equipos, primero importan límites, health checks y proceso de rollback. El orquestador no reemplaza estas reglas básicas.
Q: ¿Se pueden ejecutar varios agentes en un mismo contenedor?
A: Sí, pero suele ser más difícil gestionar aislamiento, métricas y rollback. Normalmente es más simple tener un servicio separado por rol de agente.
Que Sigue
Los contenedores te dan un entorno estable. El siguiente paso util es ver como controlar ese entorno en produccion:
- Production Stack - como unir runtime, policy, memoria y ops en un solo sistema.
- Multi-Tenant - como aislar recursos, datos y presupuestos entre clientes.
- Tool Execution Layer - como ejecutar acciones de forma segura con timeout, retry y auditoria.
- Human-in-the-Loop Architecture - donde agregar aprobacion manual para acciones riesgosas.