Cómo solucionar docker run con Exited (1) en Raspberry Pi
El error Exited (1) indica que el proceso principal del contenedor terminó inmediatamente con un código de error (1 = error genérico). En Raspberry Pi, esto no es un bug de Docker, sino un problema de compatibilidad entre la arquitectura del contenedor y el hardware del dispositivo.
🔍 Causa raíz
Tu imagen myimage probablemente fue construida para una arquitectura diferente (x86_64/amd64), mientras que Raspberry Pi usa ARM (normalmente arm32v7 o arm64v8). Cuando Docker intenta ejecutar binarios x86_64 en ARM sin emulación, el kernel lanza una excepción SIGILL (instrucción ilegal), causando que el proceso salga con código 1.
✅ Confirmado por tu hallazgo: funciona en la VM (x86_64) pero falla en el Pi físico (ARM).
🛠️ Solución definitiva
Opción 1: Construir la imagen para ARM (recomendado)
- Verifica la arquitectura de tu Raspberry Pi:
uname -m
# Salida típica: armv7l (32-bit) o aarch64 (64-bit)
- Construye tu imagen usando la arquitectura correcta:
# Para Raspberry Pi 3/4 (32-bit, la mayoría de instalaciones)
docker build --platform linux/arm/v7 -t myimage:latest .
# Para Raspberry Pi 4/5 con sistema 64-bit
docker build --platform linux/arm64 -t myimage:latest .
- Ejecuta sin cambios en el comando original:
docker run --net=host -d -t myimage
Opción 2: Usar QEMU para emulación (si no puedes reconstruir)
Si no tienes acceso al Dockerfile o no puedes reconstruir:
# Instala soporte para múltiples arquitecturas
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
# Ejecuta con arquitectura forzada
docker run --platform linux/amd64 --net=host -d -t myimage
⚠️ Nota crítica: Esta opción es muy lenta en Raspberry Pi y no es recomendable para producción. Solo úsala para depuración.
Opción 3: Verifica el error en tiempo real
Antes de aplicar cualquiera de las soluciones anteriores, captura el error real:
docker run --net=host -t myimage
# (elimina -d para ver logs en tiempo real)
O revisa el log post-mortem:
docker logs <container_id>
💡 Pro-tip: Evita este problema desde el Dockerfile
Agrega esta directiva al inicio de tu Dockerfile para asegurar compatibilidad:
# Al inicio del Dockerfile
ARG TARGETARCH
FROM --platform=linux/$TARGETARCH base-image
Y construye siempre con:
docker build --platform linux/arm/v7 -t myimage .
✅ Verificación final: Ejecuta
docker inspect myimage | grep -i architecturey confirma que coincida conarm(noamd64).
Resultado esperado: El contenedor se ejecutará sin salir inmediatamente. Si persiste el error, revisa permisos de ejecución del entrypoint y dependencias nativas (como librerías .so compiladas para x86).
Top comments (0)