[SOLUCIONADO] Error 'failed to solve: process did not complete successfully' en Docker Build
El error ERROR: failed to solve: process "/bin/sh -c..." did not complete successfully: exit code: 1 es uno de los fallos más frecuentes y frustrantes al compilar imágenes con Docker BuildKit (Buildx). Este mensaje no es el problema en sí mismo, sino un contenedor genérico que indica que una instrucción RUN dentro de tu Dockerfile falló y devolvió un código de salida distinto de cero.
Dado que BuildKit agrupa y oculta los registros secundarios por defecto en su interfaz interactiva, la causa real (un fallo en apt-get, un paquete npm corrupto, falta de memoria o incompatibilidad de arquitectura) suele quedar oculta en la consola.
El Diagnóstico Rápido
RUN con múltiples sentencias encadenadas (&&)docker build --progress=plain --no-cache . para ver la salida exacta del comando fallidobullseye)apt-get update antes de instalar y validar nombres de paquetes en la arquitectura de destino.dockerignore para excluir node_modules, .git y volcados localesLa Solución Paso a Paso
-
1
Paso 1: Ejecutar la compilación en modo plano para ver el error real
Por defecto, la interfaz TUI de BuildKit trunca los errores internos de los subprocesos. Fuerza la salida en texto plano sin usar la caché para identificar exactamente qué línea del script o gestor de paquetes provocó el fallo:
BASHdocker build --progress=plain --no-cache -t mi-imagen:latest .Examina las líneas inmediatamente anteriores al mensaje
failed to solve. Allí verás el error original, comoE: Unable to locate package,npm ERR! code ENOENTo un fallo de compilación de GCC/Python. -
2
Paso 2: Desglosar comandos complejos en instrucciones individuales
Si tu
Dockerfileagrupa múltiples pasos en un solo comando:DOCKERFILE# Difícil de depurar si falla a mitad de ejecución RUN apt-get update && apt-get install -y python3-pip curl && pip install -r requirements.txtSepara temporalmente cada comando en una directiva
RUNindependiente para aislar con precisión cuál instrucción genera el código de error:DOCKERFILERUN apt-get update RUN apt-get install -y python3-pip curl RUN pip install --no-cache-dir -r requirements.txtUna vez corregido el problema, puedes volver a unificarlos para minimizar las capas de la imagen final.
-
3
Paso 3: Blindar el contexto de construcción con .dockerignore
Si el proceso se interrumpe con
exit code: 137(OOMKilled) ocontext canceled, la causa habitual es que Docker está intentando transferir gigabytes innecesarios al demonio. Crea un archivo.dockerignoreen la raíz de tu proyecto:TEXT.git .github node_modules dist build *.log .env .venvEsto reduce drásticamente el tiempo de compilación y evita que binarios locales de arquitectura incompatible se mezclen con el entorno del contenedor.
-
4
Paso 4: Ajustar la compatibilidad de arquitectura y paquetes base
Si utilizas procesadores ARM (Apple Silicon, Raspberry Pi) y despliegas en x86_64 (o viceversa), ciertas librerías binarias fallarán al compilar en
/bin/sh. Especifica explícitamente la plataforma de destino o fija la distribución base:DOCKERFILE# Especificar plataforma explícita si hay dependencias binarias x86 FROM --platform=linux/amd64 python:3.11-slim-bookworm WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["python", "app.py"]
Preguntas Frecuentes
¿Por qué obtengo exit code 100 durante apt-get install en Docker?
El código 100 en Debian/Ubuntu suele deberse a repositorios no sincronizados (falta ejecutar apt-get update en la misma directiva) o a versiones antiguas de Docker Engine que no soportan llamadas al sistema modernas de imágenes como Debian 12 Bookworm.
¿Qué diferencia hay entre usar docker build y docker buildx build?
Buildx es el generador moderno que utiliza el motor BuildKit. Soporta compilación paralela, caché avanzada y compilación multi-arquitectura, pero requiere el flag --progress=plain para mostrar trazas de error completas en terminales estándar.
Consejo de Prevención
Prácticas de seguridad recomendadas:
- Fijación de versiones (Pinning): Nunca uses etiquetas flotantes como
latesten imágenes base de producción; define etiquetas inmutables (ej.node:20.18-alpine3.20). - Limpieza de caché en la misma capa: Siempre combina la actualización e instalación limpiando la caché en la misma línea (
apt-get update && apt-get install -y pkg && rm -rf /var/lib/apt/lists/*) para evitar residuos y garantizar reproducibilidad. - Validación de linter: Pasa herramientas como
hadolinta tus Dockerfiles en tu pipeline de CI/CD para detectar errores sintácticos antes de construir.