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

El error Exited (1) indica que el proceso principal del contenedor terminó con un código de salida no cero (error). En Raspberry Pi, este problema es especialmente común cuando se ejecutan contenedores construidos para arquitecturas x86/x64 en un sistema ARM (Raspberry Pi usa CPU ARM). La causa raíz más probable es una incompatibilidad de arquitectura de CPU.

¿Por qué ocurre?

  • Tu imagen myimage probablemente fue construida para arquitectura amd64 (x86_64), pero Raspberry Pi usa arm32v7 o arm64v8.
  • Cuando Docker intenta ejecutar un binario x86 en ARM sin emulación, el kernel lanza una excepción SIGILL (instrucción ilegal), causando que el proceso salga con código 1.
  • El hecho de que funcione en una VM de Raspberry Pi (probablemente una VM x86) confirma esta hipótesis.

Pasos para solucionarlo

1. Verifica la arquitectura de tu Raspberry Pi y de la imagen

# En tu Raspberry Pi:
uname -m
# Salida esperada: armv7l (Raspberry Pi 3/4 32-bit) o aarch64 (Raspberry Pi 4 64-bit)

# Verifica la arquitectura de tu imagen:
docker inspect myimage | grep -i architecture
# O mejor aún:
docker run --rm tonistiigi/binfmt --version
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
Enter fullscreen mode Exit fullscreen mode

2. Usa QEMU para emulación (si no puedes reconstruir la imagen)

Instala soporte de emulación multiarquitectura:

sudo apt update && sudo apt install -y qemu-user-static binfmt-support
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
Enter fullscreen mode Exit fullscreen mode

Luego ejecuta tu contenedor:

docker run --net=host -d -t myimage
Enter fullscreen mode Exit fullscreen mode

⚠️ Nota: La emulación es lenta y puede causar problemas de estabilidad en producción.

3. Solución definitiva: Reconstruye la imagen para ARM

Opción A: Usa docker buildx desde tu máquina de desarrollo

# Crea un builder con soporte multiarquitectura
docker buildx create --name mybuilder --use

# Inicia el builder
docker buildx inspect --bootstrap

# Construye e impulsa la imagen para ARM
docker buildx build \
  --platform linux/arm/v7,linux/arm64 \
  --push \
  -t tu-usuario/myimage:latest \
  .
Enter fullscreen mode Exit fullscreen mode

Opción B: Construye directamente en Raspberry Pi

Si tienes acceso físico a la Raspberry Pi:

# Asegúrate de tener Docker CE instalado (no Docker.io del repositorio de Debian)
curl -sSL https://get.docker.com | sh

# Construye localmente
docker build -t myimage .
docker run --net=host -d -t myimage
Enter fullscreen mode Exit fullscreen mode

4. Verifica el log del contenedor

Si el problema persiste, revisa el log:

docker run --net=host -t myimage  # Ejecuta sin -d para ver logs en consola
# O después de un fallo:
docker logs <container_id>
Enter fullscreen mode Exit fullscreen mode

Bloque de código corregido (ejemplo funcional)

# Paso 1: Instalar soporte multiarquitectura (si no puedes reconstruir)
sudo apt update && sudo apt install -y qemu-user-static binfmt-support
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

# Paso 2: Ejecutar con la red host (sin espacios en `--net=host`)
docker run --net=host -d -t myimage

# Paso 3: Verificar estado
docker ps -a
docker logs <ID_CONTENEDOR>
Enter fullscreen mode Exit fullscreen mode

Pro-tip

  • Nunca uses --net = host (con espacios). Docker interpretará = como parte del valor del flag, causando errores silenciosos. Usa siempre --net=host.
  • En Raspberry Pi, evita imágenes oficiales de Docker Hub que solo publiquen amd64. Busca variantes con sufijo arm32v7, arm64v8, o usa imágenes que publiquen manifiestos multiarquitectura (ej: node:18-alpine sí lo hace, node:18 por defecto no).
  • Para imágenes personalizadas, siempre construye con docker buildx para garantizar compatibilidad multiplataforma.

Verificación final: Si el contenedor arranca y se mantiene en ejecución (no Exited (1)), y docker ps lo muestra como Up X seconds, el problema está resuelto.

Top comments (0)