|

Automatiza Docker pulls con Archon en 30 líneas

Un desarrollador frontend en Kolkata automatizó sus despliegues Docker usando Archon, reduciendo el tiempo de 32 minutos a 2 minutos 14 segundos. La solución usa reintentos automáticos, manejo inteligente de timeouts y notificaciones de fallos para eliminar los cuelgues indefinidos de docker pull commands que enfrentan equipos con conexiones lentas o interrupciones frecuentes.

En 30 segundos

  • Docker pulls se cuelgan cuando hay network lenta, Docker Hub returns 429, o cortes de energía — Archon reintentas automáticamente sin intervención manual
  • Bash scripts y subprocess de Python fallan porque no tienen reintentos inteligentes, timeouts configurables, o notificaciones de estado — Archon resuelve eso en 30 líneas
  • El case study pasó de 32 minutos 14 segundos (deploy colgado, site unavailable) a 2 minutos 14 segundos usando docker pull –all-tags paralelizado
  • Se integra directamente en GitHub Actions, GitLab CI, Azure Pipelines — reemplaza scripts manuales sin cambiar tu CI/CD existente
  • El overhead es bajo: solo necesitás Archon instalado y reemplazar tu comando docker pull con archon.task() + archon.run()

El problema de los Docker pulls lentos e inconsistentes

Ponele que estás desplegando una aplicación en producción, tu deploy script arranca docker pull y el comando se cuelga. La imagen tarda 25, 32, 40 minutos en descargar (si llega a descargar). Mientras tanto tu sitio está offline.

Esto es lo que pasó el lunes a la mañana a un developer en Kolkata que corría CoderFact website. No era un problema raro ni específico de su máquina — es un issue común cuando tenés internet lenta (muy frecuente en Latinoamérica también), problemas de conectividad intermitente, o Docker Hub está devolviendo rate limiting (código 429).

Lo peor es que sin reintentos automáticos, el deployment se queda esperando indefinidamente o falla sin reintentar. El sitio cae. Vos estás a las 3 de la mañana arreglando logs.

La realidad de usar Docker en ambientes con internet inconsistente: un comando que funciona localmente en tu máquina de desarrollo puede fallar de forma impredecible en producción (sí, acá en Argentina también pasa constantemente).

Limitaciones de los scripts bash y Python tradicionales

El enfoque tradicional es escribir un bash script que haga docker pull y ya. Algo así:

#!/bin/bash
docker pull imagen:tag
docker pull otra-imagen:tag
Ya lo cubrimos antes en ejecutar agentes locales sin depender de APIs.

¿Problemas? Montones.

  • Sin reintentos: si la descarga falla a los 15 minutos, fallás. Sin reintento, sin lógica de espera exponencial, nada.
  • Sin timeouts configurables: el comando se cuelga indefinidamente si Docker Hub no responde
  • Sin visibilidad: no sabés qué está pasando — estás esperando a ciegas
  • Sin paralelización inteligente: descargás imagen por imagen secuencialmente, triplicando el tiempo
  • Sin manejo de errores específicos: un error de red, rate limiting, o credentials inválidos se tratan todos igual

Cuando intentás mejorar el bash script agregando lógica de reintentos con while loops, terminás con código frágil, difícil de mantener, y propenso a bugs en el manejo de signals (si matás el script a mitad de ejecución pasa cualquier cosa).

Introducción a Archon para automatización Docker

Archon es una herramienta de orquestación de workflows que maneja tareas con reintentos automáticos, timeouts configurables, notificaciones de estado, y paralelización. No es específica de Docker, pero es perfecta para este caso.

La ventaja sobre bash/Python puro es que Archon fue diseñada para exactamente este problema: ejecutar comandos que pueden fallar de formas impredecibles en ambientes con internet inconsistente.

Lo interesante es que el autor no necesitaba frameworks pesados como Ansible, Kubernetes, o CI/CD complejo. Solo necesitaba un orquestador simple que reintentase de forma inteligente.

Implementación en 30 líneas: paso a paso

Así es cómo se ve la solución con Archon (Python):

from archon import Archon, task
import subprocess

archon = Archon()

@task(retries=3, timeout=600)
def pull_image(image_tag):
    subprocess.run(['docker', 'pull', image_tag], check=True)

@task(retries=2, timeout=300)
def run_compose():
    subprocess.run(['docker-compose', 'up', '-d'], check=True)

def main():
    images = ['app:latest', 'db:5.7', 'cache:6.2']
    
    # Ejecuta pulls en paralelo
    for img in images:
        archon.enqueue(pull_image, img)
    
    # Espera a que terminen
    archon.wait()
    
    # Una vez que todas las imágenes están, levanta los containers
    archon.enqueue(run_compose)
    archon.run()

if __name__ == '__main__':
    main()

Qué hace cada línea:

  • @task(retries=3, timeout=600) — reintentá la tarea 3 veces si falla, máximo 10 minutos por intento
  • @task(retries=2, timeout=300) — docker-compose up toma menos tiempo, 2 reintentos, 5 minutos timeout
  • archon.enqueue() — agrega la tarea a la cola de ejecución
  • archon.wait() — espera a que TODAS las pulls terminen antes de continuar
  • archon.run() — ejecuta las tareas encoladas

Lo que no ves en el código pero que Archon maneja automáticamente: reintentos con backoff exponencial (reintenta a los 2s, luego 4s, 8s), captura de errors específicos, y opcional notificaciones a Slack o Telegram cuando algo falla.

Reintentos automáticos y notificaciones de fallos

Ojo con esto: Archon usa backoff exponencial inteligente. Si el primer intento falla: Tema relacionado: consideraciones de seguridad en la automatización.

Intento 1: falla al minuto 1 (network error)
Espera 2 segundos
Intento 2: falla al minuto 2 (Docker Hub rate limited)
Espera 4 segundos
Intento 3: éxito
Tiempo total: ~3 minutos vs 32 minutos + manual retry

Para agregar notificaciones, solo necesitás configurar handlers:

from archon.notifiers import TelegramNotifier

notifier = TelegramNotifier(token='tu_bot_token', chat_id='123456')
archon.on_failure(notifier.send)

Así, si algo falla después de reintentos, Telegram te avisa al toque. No estás esperando a que alguien revise logs.

Integración en pipelines CI/CD existentes

Si ya usás GitHub Actions, GitLab CI, o Azure Pipelines, Archon se integra sin cambiar tu workflow file.

GitHub Actions:

name: Deploy
on: push
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.11'
      - run: pip install archon
      - run: python deploy.py # <- tu script con Archon

GitLab CI:

deploy:
  stage: deploy
  image: python:3.11
  script:
    - pip install archon
    - python deploy.py
  only:
    - main
Te puede servir nuestra cobertura de optimizar el rendimiento con herramientas de IA.

Comparado con otras opciones, acá está la diferencia:

HerramientaCurva de aprendizajeSetupReintentosNotificacionesIdeal para
Bash puroBajaNingunoManualNoScripts simples (pero frágiles)
AnsibleMedia-AltaComplejo (inventory, playbooks)Sí (built-in)Orquestación de múltiples máquinas
ArchonBajaMínimo (import + decoradores)Sí (automático)Sí (pluggable)Docker, deployments, tareas que fallan
KubernetesAltaMuy complejo (manifests, cluster)Sí (nativo)Orquestación a escala enterprise
automatizar docker pulls diagrama explicativo

La ventaja: Archon es "just right" — no es overkill como Kubernetes, pero mucho más robusto que bash. Instalás el paquete, escribís el script, y funciona.

Comparativa de rendimiento: antes vs después

El case study real: publicado el 2026-04-12.

MétricaAntes (Bash + subprocess)Después (Archon)Mejora
Tiempo de deploy32 minutos 14 segundos2 minutos 14 segundos93% más rápido (30 min menos)
Disponibilidad del sitioOffline durante pulls (30+ min)Online en 2 min15x mejor SLA
Reintentos en fallosManual (humano debe revisar logs)Automático (3 reintentos)100% automatizado
Visibilidad de progresoNada (cuelgue indefinido)Logs con timestamp + notificacionesDebugging posible en <1 min
ParalelizaciónSecuencial (img1 → img2 → img3)Paralelo (img1, img2, img3 simultáneas)3-5x speedup de pulls

Lo importante: pasó de estar fumando un café esperando a que el deploy termine a poder hacer un deploy cada 2 minutos sin stress. La disponibilidad mejoró dramaticamente.

Errores comunes

Reintent timeout muy largo

@task(retries=5, timeout=3600) # ← MAL: 1 hora es demasiado

Si configuras timeout de 60 minutos "para estar seguro", básicamente anulás los reintentos. Si falla al minuto 50, seguís esperando 10 minutos más sin hacer nada. Mejor: 300-600 segundos (5-10 min) por intento.

No paralelizar pulls

archon.enqueue(pull_image, 'img1')
archon.wait() # ← Espera antes de encolar img2
archon.enqueue(pull_image, 'img2')
archon.wait()

Esto serializa los pulls. Encolá todas las imágenes primero, luego llamá wait() una sola vez:

for img in images:
    archon.enqueue(pull_image, img)
archon.wait() # ← Una sola espera para todas
Cubrimos ese tema en detalle en elegir la plataforma adecuada para tu CI/CD.

No validar que la imagen se descargó correctamente

@task(retries=3)
def pull_image(tag):
    subprocess.run(['docker', 'pull', tag])

Sin `check=True`, si el comando falla silenciosamente (la imagen no se descargó pero el exit code es 0), continuás al siguiente paso creyendo que todo está bien. Agregá validación:

@task(retries=3)
def pull_image(tag):
    result = subprocess.run(['docker', 'pull', tag], check=True)
    # Validá que la imagen existe
    subprocess.run(['docker', 'inspect', tag], check=True)

Preguntas Frecuentes

¿Archon necesita una base de datos o servidor separado?

No. Archon es una librería Python que corre en el mismo proceso que tu script. Sin dependencias externas, sin base de datos, sin servidor. Instalás el paquete y listo.

¿Qué pasa si docker pull se cuelga después del reintento final?

Archon lanza una excepción que podés capturar. Configurando notificadores, te avisa por Telegram o Slack. Después el script se detiene (fail-fast). No continúa al docker-compose up si no se descargaron las imágenes.

¿Puedo usar esto en Windows (como en los blogs donweb)?

Sí. Archon es agnóstico de OS. Funciona en Windows, Linux, macOS. Lo que importa es que Docker Desktop esté instalado y corriendo en tu máquina.

¿Qué tan diferente es a simplemente usar GitHub Actions con reintentos?

GitHub Actions tiene reintentos pero son "brutos" — reintentá el step completo. Archon te permite granularidad: reintentá solo el docker pull, no todo el deploy. Además, Archon funciona en cualquier CI/CD o locally, no solo en Actions.

¿Archon tiene overhead o latencia adicional?

Mínimo. Es una librería delgada que envuelve subprocess.run(). La overhead es el tiempo de setup del objeto Archon (~milisegundos). Dominado por el tiempo real de las pulls, que siguen siendo docker pull native.

Conclusión

Si tus deployments Docker se cuelgan frecuentemente, especialmente en ambientes con internet inconsistente, Archon te ahorra horas de debugging y frustración. El beneficio es concreto: 30 minutos de downtime → 2 minutos. Zero intervención manual.

No necesitás Kubernetes, Ansible, o frameworks complejos. Solo instalás Archon, agregas decoradores a tus funciones, y obtenés reintentos inteligentes, paralelización, y notificaciones de fallos.

Para equipos de DevOps y backend engineers que corren Docker, esto es un quick win. Si ya estás publicando artículos con automatización Docker (como en los blogs donweb que usan donweb.com para hosting), optimizar tus deploys es el siguiente paso obvio.

Fuentes

Similar Posts