Article

El despliegue que no podía recrear su propio contenedor

Un docker compose up interrumpido deja un contenedor huérfano, con prefijo de hash, ocupando el nombre de un servicio, de modo que todos los despliegues posteriores fallan al recrearlo hasta que alguien lo elimina a mano. Añadir --remove-orphans (o una limpieza previa) permite que el despliegue repare su propia pila en lugar de fallar por el estado que dejó una ejecución anterior.
July 14, 2026
Topics:Deployment
Tags:DockerAnsibleGitHub Actions

Dos despliegues seguidos fallaron con el mismo error de Docker, y ninguno fue culpa de nuestro código. Un conflicto de nombre de contenedor atascó toda la pila. Esto es lo que lo deja atrás, y cómo hacer que el despliegue se repare solo.

El error

Container app  Recreate
Error response from daemon: Conflict. The container name
"/ab03b9ef_app" is already in use by container "4619ca...".

La imagen se construyó bien. La falla ocurrió en el paso de recreación, y detuvo el despliegue en seco.

Qué lo deja atrás

Cuando docker compose up recrea un servicio, renombra el contenedor antiguo a un <hash>_<name> temporal antes de crear el nuevo y eliminar el antiguo. Si esa secuencia se interrumpe —un despliegue cancelado, un reinicio del host, un OOM—, el contenedor renombrado sobrevive. Ahora un contenedor ocupa un nombre que Compose espera que esté libre, y el siguiente up no puede reclamarlo. Todos los despliegues posteriores chocan con el mismo conflicto hasta que alguien elimina el huérfano a mano.

La solución de una línea

Compose puede limpiar esto por sí mismo:

docker compose up -d --build --remove-orphans

--remove-orphans elimina los contenedores del proyecto que no están en el archivo compose actual —incluido el residuo renombrado extraviado— antes de recrear. Como defensa en profundidad, añada una comprobación previa que elimine a la fuerza cualquier contenedor cuyo nombre coincida con el servicio pero que no sea el gestionado por compose.

Por qué vale la pena automatizarlo

  • No es su código. Una versión perfectamente buena falla por el estado del host que dejó una ejecución anterior interrumpida. Sin autorreparación, cada despliegue está a una mala interrupción de una visita manual al host.
  • Falla en el peor momento. La compilación tiene éxito, así que usted cree que está desplegando; entonces la recreación se atasca y, si tiene reversión automática, esta se activa y la versión silenciosamente no se lanza.
  • La solución manual no escala. "Entrar por SSH y hacer docker rm del huérfano" está bien una vez. No es una estrategia de despliegue.

Conclusión

Un despliegue debería poder recuperarse de su propia ejecución anterior interrumpida. Si su paso de recreación puede atascarse por un contenedor residual, añada --remove-orphans (o una limpieza previa) para que el siguiente despliegue repare la pila en lugar de fallar por ella.