DEV Community

Erick Eduardo Ramos
Erick Eduardo Ramos

Posted on

Cómo solucionar `docker run` con `Exited (1)` en Raspberry Pi

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 usa armhf o arm64.
  • Falta de binarios compatibles: El ENTRYPOINT o CMD del 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 red host requiere 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

⚠️ 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
Enter fullscreen mode Exit fullscreen mode

Opción B: Construye la imagen en la Raspberry Pi

# Clona o copia tu Dockerfile en la Pi
docker build -t myimage .
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

⚠️ --privileged es peligroso en producción. Usa --cap-add=SYS_ADMIN o 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
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

Resultado esperado: El contenedor se inicia y permanece en ejecución (docker ps muestra estado Up). Si sigue fallando, revisa los logs con docker logs <container_id>.

Top comments (0)