Cómo solucionar Code exited (1) en Docker en Raspberry Pi
Explicación técnica
El error Exited (1) indica que el proceso principal (PID 1) del contenedor terminó con un código de salida distinto de cero —en este caso, 1, que es un código genérico de error. En Raspberry Pi, este problema es especialmente común cuando se ejecutan contenedores construidos para arquitecturas x86/x64 en una máquina ARM (como la Raspberry Pi), o cuando hay incompatibilidades en la imagen (por ejemplo, dependencias binarias no compatibles con el entorno de ejecución).
En tu caso, el hecho de que funcione en una VM (probablemente x86_64) pero no en la Raspberry Pi física es una pista crítica: tu imagen no es compatible con la arquitectura ARM de la Raspberry Pi.
Otras causas comunes:
- Falta de permisos o dispositivos (
/dev/mem,/dev/gpiomem, etc.). - Incompatibilidad de librerías (
libc,libstdc++, etc.) entre entornos. - Error en el
ENTRYPOINToCMDdel Dockerfile (por ejemplo, ejecutar un binario x86 en ARM). - Variables de entorno faltantes o incorrectas.
Pasos para solucionarlo
✅ Paso 1: Verifica la arquitectura de tu imagen y del host
# En tu Raspberry Pi:
uname -m
# Debería mostrar: armv7l (Raspberry Pi 3/4) o aarch64 (Raspberry Pi 4/5 con 64-bit OS)
docker images | grep myimage
# Si no ves "arm" o "aarch64" en la etiqueta, es probable que la imagen sea x86_64
✅ Paso 2: Ejecuta el contenedor en primer plano para ver el error real
docker run --net=host -it --rm myimage
# NOTA: Quita `-d` y `-t`, y añade `-i` para interactividad
⚠️ Si ves errores como
Illegal instruction,cannot execute binary file, oExec format error, confirma que es un problema de arquitectura.
✅ Paso 3: Construye la imagen para ARM (solución definitiva)
Opción A: Usa buildx para construir multi-arch (recomendado)
# Habilitar buildx
docker buildx create --use
# Construir e impulsar imagen multi-arch (x86 + arm32v7 / arm64v8)
docker buildx build \
--platform linux/arm/v7,linux/arm64 \
-t myimage:latest \
--push \
.
Si tu imagen es simple (ej. basada en
alpine,debian, etc.), asegúrate de usar imágenes base compatibles con ARM:FROM arm32v7/ubuntu:20.04 # o FROM arm64v8/ubuntu:20.04
Opción B: Si ya tienes la imagen x86 y no puedes reconstruirla
# Instalar QEMU y binfmt para emulación (lento, pero funcional)
sudo apt update && sudo apt install -y qemu-user-static binfmt-support
# Registra el binfmt handler
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
# Ahora puedes ejecutar:
docker run --net=host -d -t myimage
⚠️ Nota: La emulación QEMU es 10–100x más lenta y puede fallar con instrucciones específicas del hardware (como acceso a GPIO, GPU, etc.).
Bloque de código corregido (ejemplo práctico)
Dockerfile para Raspberry Pi 3/4 (32-bit)
FROM arm32v7/debian:bullseye-slim
RUN apt-get update && apt-get install -y \
your-dependencies \
&& rm -rf /var/lib/apt/lists/*
COPY your-binary /app/
WORKDIR /app
# Asegúrate de que el binario sea ARM-compatible
CMD ["./your-binary"]
Comando de ejecución corregido (sin espacios en --net)
docker run --net=host -d -t myimage
# ❌ NO: --net = host (espacios rompen el flag)
# ✅ SÍ: --net=host
🔥 ¡Cuidado con los espacios! En tu comando original:
--net = hostes inválido. Docker lo interpreta como--netcon valor" = host"→ falla silenciosamente o crea un error de red.
Pro-tip: Diagnóstico rápido con strace
Si necesitas ver exactamente dónde falla el proceso:
# Construye una imagen con strace incluido (o usa una imagen base que lo tenga)
FROM arm32v7/debian:bullseye-slim
RUN apt-get update && apt-get install -y strace
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["strace", "-f", "-o", "/tmp/strace.log", "/entrypoint.sh"]
Luego ejecuta y recupera el log:
docker run --net=host -d -t myimage
docker cp <container_id>:/tmp/strace.log ./strace.log
✅ Resumen final:
- Quita los espacios en
--net=host. - Verifica arquitectura (
uname -mvsdocker images). - Usa
buildxpara construir imágenes nativas ARM. - Usa QEMU solo como solución temporal.
¿Tu imagen usa acceso a hardware (GPIO, I2C, etc.)? Si es así, añade --privileged o monta los dispositivos explícitamente (--device /dev/gpiomem).
Top comments (0)