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 arm32v7 o arm64v8.
  • Falta de binarios compatibles: El ENTRYPOINT o CMD del contenedor intenta ejecutar un binario compilado para otra arquitectura.
  • Problemas de permisos o dependencias faltantes en el entorno embebido (especialmente en Raspberry Pi OS Lite sin GUI).
  • Uso incorrecto de --net=host: En algunas versiones de Docker en Raspberry Pi, el flag --net=host puede causar fallos si el sistema no lo soporta correctamente.

🔍 Nota crítica: En tu comando original docker run --net = host -d -t myimage, hay un error de sintaxis: --net = host tiene espacios alrededor del =. Docker lo interpreta como un nombre de red literal " = host", lo que probablemente falla.


Pasos para solucionarlo

Paso 1: Corrige la sintaxis del comando

# ❌ Incorrecto (con espacios en `--net`)
docker run --net = host -d -t myimage

# ✅ Correcto (sin espacios)
docker run --net host -d -t myimage
Enter fullscreen mode Exit fullscreen mode

⚠️ Importante: En Docker CLI, los flags con valores no deben tener espacios entre el =. Usa --net=host o --net host, pero nunca --net = host.


Paso 2: Verifica la arquitectura de la imagen

Ejecuta en tu Raspberry Pi:

docker inspect myimage --format '{{.Architecture}}'
Enter fullscreen mode Exit fullscreen mode

Si el resultado es amd64, la imagen no es compatible con Raspberry Pi.

Solución: Reconstruir la imagen para ARM

Si tienes el Dockerfile, usa multi-arch build:

# Al inicio del Dockerfile (antes de FROM)
# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM golang:1.21-alpine AS builder
...
Enter fullscreen mode Exit fullscreen mode

O construye explícitamente para ARM:

# En tu máquina de desarrollo (x86_64)
docker buildx create --use
docker buildx build --platform linux/arm/v7 -t myimage:armv7 . --push
# o para Pi 4 (64-bit):
docker buildx build --platform linux/arm64 -t myimage:arm64 . --push
Enter fullscreen mode Exit fullscreen mode

Paso 3: Ejecuta en primer plano para depurar

# Elimina -d (modo detached) y añade -it para interactividad
docker run --rm --net host -it myimage
Enter fullscreen mode Exit fullscreen mode

Esto mostrará el error en tiempo real (ej. standard_init_linux.go:211: exec user process caused: no such file or directory → indica binario incompatible).


Paso 4: Verifica dependencias críticas en Raspberry Pi

  • ¿Usas Raspberry Pi OS Lite (sin entorno gráfico)? Algunas imágenes requieren bibliotecas como libgl1, libglib2.0-0, etc.

Solución:

  sudo apt update && sudo apt install -y libgl1 libglib2.0-0
Enter fullscreen mode Exit fullscreen mode
  • ¿El contenedor intenta usar /dev/mem o hardware específico? Añade permisos:
  docker run --rm --net host --privileged -it myimage
Enter fullscreen mode Exit fullscreen mode

Bloque de código corregido (ejemplo funcional)

# 1. Verifica arquitectura de la imagen
docker inspect myimage --format '{{.Architecture}}'

# 2. Si es amd64, reconstruye para ARM (ejemplo para Pi 3/4)
docker buildx build --platform linux/arm/v7 -t myimage:armv7 . --load

# 3. Ejecuta con sintaxis correcta y modo depuración
docker run --rm --net host -it myimage:armv7
Enter fullscreen mode Exit fullscreen mode

Pro-tip: Diagnóstico rápido en Raspberry Pi

# 1. Verifica si el contenedor existe y su estado
docker ps -a --filter "name=myimage" --format "table {{.ID}}\t{{.Status}}\t{{.Command}}"

# 2. Obten los logs (aunque esté exitido)
docker logs myimage

# 3. Verifica arquitectura del host
uname -m
# Debería mostrar: armv7l (32-bit) o aarch64 (64-bit)
Enter fullscreen mode Exit fullscreen mode

💡 Consejo final: Si usas imágenes oficiales (como node, python, alpine), siempre elige variantes con sufijo -arm32v7 o arm64v8. Ejemplo:

arm32v7/node:18-alpine

node:18-alpine ❌ (solo x86_64)

Top comments (0)