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:

  • Incompatibilidad de arquitectura: 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 ejecuta un binario compilado para otra arquitectura.
  • Problemas de permisos o recursos limitados (menos común, pero posible en dispositivos con poca RAM).
  • Uso incorrecto de --net=host: En algunas versiones de Docker en Raspberry Pi, esto puede causar fallos si el sistema no lo soporta correctamente.

La evidencia clave: funciona en una VM de Raspberry Pi pero no en hardware real → sugiere una diferencia en la arquitectura de la imagen o en la versión de Docker.


Pasos para solucionarlo

1. Verifica la arquitectura de tu imagen y del host

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

docker info | grep "Architecture"
# Debe coincidir con lo anterior
Enter fullscreen mode Exit fullscreen mode

2. Verifica si la imagen es compatible

docker inspect myimage | grep -A5 '"Architecture"'
Enter fullscreen mode Exit fullscreen mode

Si ves "Architecture": "amd64", la imagen no es compatible con ARM.

3. Reconstruye la imagen para ARM (solución definitiva)

Opción A: Usa docker buildx (recomendado)

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

# Inicia el builder
docker buildx inspect --bootstrap

# Construye para ARMv7 (Raspberry Pi 3/4 32-bit) o ARM64 (Raspberry Pi 4/5 64-bit)
# Para 32-bit:
docker buildx build --platform linux/arm/v7 -t myimage:armv7 --push . 

# Para 64-bit (si usas Raspberry Pi OS 64-bit):
docker buildx build --platform linux/arm64 -t myimage:arm64 --push .
Enter fullscreen mode Exit fullscreen mode

⚠️ Si no tienes un registro (registry), omite --push y usa --load para cargar localmente:

docker buildx build --platform linux/arm/v7 -t myimage:armv7 --load .

Opción B: Usa una imagen base compatible

Asegúrate de que tu Dockerfile use una imagen base ARM-compatible:

# ❌ Incorrecto (x86)
FROM ubuntu:22.04

# ✅ Correcto para Raspberry Pi 3/4 32-bit
FROM arm32v7/ubuntu:22.04

# ✅ Correcto para Raspberry Pi 4/5 64-bit
FROM arm64v8/ubuntu:22.04
Enter fullscreen mode Exit fullscreen mode

4. Ejecuta sin -d para depurar

docker run --net=host -t myimage
Enter fullscreen mode Exit fullscreen mode
  • Si falla, verás el mensaje de error en consola.
  • Si funciona, el problema es que el proceso termina inmediatamente (ej. no hay servicio en segundo plano).

5. Verifica logs si el contenedor se crea

docker run --net=host -d myimage
docker ps -l -q | xargs docker logs
Enter fullscreen mode Exit fullscreen mode

Bloque de código corregido

# 1. Verifica arquitectura
uname -m && docker info | grep "Architecture"

# 2. Si la imagen no es ARM, reconstruye (ejemplo para Raspberry Pi 4 64-bit)
docker buildx build \
  --platform linux/arm64 \
  -t myimage:arm64 \
  --load \
  .

# 3. Ejecuta la versión corregida
docker run --net=host -d -t myimage:arm64
Enter fullscreen mode Exit fullscreen mode

Pro-tip: Evita este problema desde el inicio

  • Siempre especifica --platform al construir imágenes para Raspberry Pi:
  docker build --platform linux/arm/v7 -t myimage .
Enter fullscreen mode Exit fullscreen mode
  • Usa docker manifest para verificar compatibilidad:
  docker manifest inspect ubuntu:22.04 | grep -A1 '"platform"'
Enter fullscreen mode Exit fullscreen mode
  • Para Raspberry Pi 3/4 32-bit, usa linux/arm/v7; para Pi 4/5 64-bit, usa linux/arm64.

🔍 Nota crítica: El error --net = host (con espacios) en tu comando original es inválido. Docker lo ignora y lo interpreta como --net=host, pero en versiones antiguas de Docker en Raspberry Pi esto puede causar fallos. Usa siempre --net=host sin espacios.


🚀 ¿Quieres más soluciones técnicas?

Si te sirvió esta ayuda, suscríbete para recibir los errores más comunes de la semana y cómo evitarlos.
👉 Suscríbete aquí

Top comments (0)