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
myimageprobablemente fue construida para arquitecturaamd64(x86_64), pero Raspberry Pi usaarm32v7oarm64v8. - 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
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
Luego ejecuta tu contenedor:
docker run --net=host -d -t myimage
⚠️ 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 \
.
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
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>
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>
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 sufijoarm32v7,arm64v8, o usa imágenes que publiquen manifiestos multiarquitectura (ej:node:18-alpinesí lo hace,node:18por defecto no). - Para imágenes personalizadas, siempre construye con
docker buildxpara garantizar compatibilidad multiplataforma.
✅ Verificación final: Si el contenedor arranca y se mantiene en ejecución (no
Exited (1)), ydocker pslo muestra comoUp X seconds, el problema está resuelto.
Top comments (0)