Cómo solucionar docker run con Exited (1) en Raspberry Pi
¿Por qué ocurre este error?
El código de salida 1 indica que el proceso principal del contenedor terminó con un error genérico. En Raspberry Pi, los casos más comunes son:
-
Arquitectura incompatible: La imagen fue construida para
amd64(x86_64), pero Raspberry Pi usaarmhfoarm64. -
Falta de binarios compatibles: El
ENTRYPOINToCMDdel contenedor intenta ejecutar un binario compilado para otra arquitectura. -
Problemas de permisos o recursos: Especialmente en entornos embebidos como Raspberry Pi, donde pueden faltar dispositivos (
/dev/*) o permisos de ejecución. -
Uso incorrecto de
--net = host: El espacio de nombres de redhostrequiere privilegios elevados y puede fallar si el contenedor no tiene--privileged.
🔍 Clave diagnóstica: El hecho de que funcione en una VM de Raspberry Pi (probablemente emulando x86_64 con QEMU) pero no en el hardware físico confirma que el problema es arquitectura.
Pasos para solucionarlo
1. Verifica la arquitectura del host y de la imagen
# Arquitectura del host (Raspberry Pi)
uname -m
# Arquitectura de la imagen
docker inspect --format='{{.Architecture}}' myimage
Si el host muestra armv7l o aarch64, pero la imagen muestra amd64, la arquitectura no coincide.
2. Ejecuta el contenedor en primer plano para ver el error real
docker run --net=host -it --rm myimage
⚠️ Nota: Quita
-d(background) y-t(TTY) para ver los logs en tiempo real. Si el error es por arquitectura, verás algo como:standard_init_linux.go:211: exec user process caused: no such file or directory
3. Construye o descarga una imagen compatible con ARM
Opción A: Usa imágenes oficiales multiarquitectura (recomendado)
# Ejemplo: imagen oficial de Python compatible con ARM
docker run --net=host -d -t python:3.11-slim
Opción B: Construye la imagen en la Raspberry Pi
# Clona o copia tu Dockerfile en la Pi
docker build -t myimage .
Opción C: Usa QEMU para emular (solo para pruebas)
# Instala soporte multiarquitectura
sudo apt install qemu-user-static
# Registra el binario en Docker
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
# Ahora puedes ejecutar imágenes x86_64 (lento)
docker run --net=host -d -t myimage
4. Corrige el comando --net=host
El espacio de nombres host no requiere espacios en el argumento:
❌ --net = host
✅ --net=host
El error de sintaxis puede causar que Docker interprete
=como parte del valor, fallando silenciosamente o lanzando un error no obvio.
5. Verifica permisos y dispositivos
Si el contenedor necesita acceso a hardware (GPIO, I2C, etc.), añade:
docker run \
--net=host \
--privileged \
-v /dev:/dev \
-d -t myimage
⚠️
--privilegedes peligroso en producción. Usa--cap-add=SYS_ADMINo dispositivos específicos (--device=/dev/i2c-1) si solo necesitas acceso limitado.
Bloque de código corregido
# Paso 1: Verifica arquitectura
docker inspect --format='{{.Architecture}}' myimage
# Paso 2: Ejecuta en primer plano para debug
docker run --net=host -it --rm myimage
# Paso 3: Si falla por arquitectura, reconstruye o usa multiarch
# Opción recomendada: construye localmente
docker build -t myimage-arm .
# Paso 4: Ejecuta con sintaxis correcta y permisos necesarios
docker run --net=host -d -t myimage-arm
Pro-tip: Automatiza la detección de arquitectura
Crea un script de inicio rápido:
#!/bin/bash
ARCH=$(uname -m)
case "$ARCH" in
armv7l) IMAGE_TAG="arm32v7/myimage" ;;
aarch64) IMAGE_TAG="arm64v8/myimage" ;;
*) echo "Arquitectura no soportada: $ARCH"; exit 1 ;;
esac
docker run --net=host -d -t "$IMAGE_TAG"
✅ Resultado esperado: El contenedor se inicia y permanece en ejecución (
docker psmuestra estadoUp). Si sigue fallando, revisa los logs condocker logs <container_id>.
Top comments (0)