Cómo solucionar Code exited (1) en Docker en Raspberry Pi
¿Por qué ocurre este error?
El código de salida 1 indica que el proceso principal del contenedor (PID 1) terminó con un error. En Raspberry Pi, los casos más comunes son:
-
Arquitectura incompatible: La imagen se construyó para
amd64pero se ejecuta en ARM (armv7loaarch64). -
Falta de binario ejecutable: El
ENTRYPOINToCMDde la imagen no existe o no tiene permisos de ejecución. -
Faltan dependencias del sistema: Librerías compartidas (
libc,libstdc++, etc.) no disponibles en el entorno ARM. - Problemas de permisos en dispositivos físicos: Acceso a GPIO, I2C, SPI, etc., sin los privilegios adecuados.
⚠️ Nota crítica: El comando
docker run --net = hosttiene un error de sintaxis: los espacios alrededor del=son inválidos. Debe ser--net=host.
Pasos para diagnosticar y solucionar
1. Verifica el código de error real (sin -d)
Ejecuta el contenedor en primer plano para ver el error en tiempo real:
docker run --net=host -it --rm myimage
Si el contenedor se cierra inmediatamente, este paso mostrará el mensaje de error real (ej:
exec format error,No such file or directory, etc.).
2. Confirma la arquitectura del contenedor y del host
# En tu Raspberry Pi:
uname -m # Ej: armv7l o aarch64
# En la imagen (si puedes ejecutarla en modo interactivo):
docker run --rm -it myimage uname -m
Si el resultado no coincide (ej: x86_64 vs armv7l), la imagen no es compatible.
3. Reconstruye la imagen para ARM (solución definitiva)
Opción A: Usa buildx para multiarquitectura
# Crea un builder con soporte multiarquitectura
docker buildx create --use --name mybuilder
# Construye e impulsa una imagen compatible con 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 no tienes acceso a x86, construye directamente en la Pi:
docker build -t myimage .
🔧 Recomendación: Usa un Dockerfile con base compatible con ARM (ej:
arm32v7/debian:bullseyeobalenalib/raspberry-pi-python:3.9-bullseye).
4. Verifica el ENTRYPOINT y CMD
Revisa tu Dockerfile:
# ❌ Incorrecto: Ruta relativa o binario no existente
CMD ["./start.sh"]
# ✅ Correcto: Ruta absoluta y binario existente
CMD ["/usr/local/bin/start.sh"]
Asegúrate de que:
- El binario sea compatible con ARM.
- Tenga permisos de ejecución (
chmod +x). - Las dependencias dinámicas estén instaladas (ej:
apt-get install -y libglib2.0-0).
5. Solución rápida para pruebas (no productiva)
Si solo necesitas ejecutar una imagen amd64 en ARM (ej: para emulación):
docker run --net=host --platform linux/amd64 -d -t myimage
⚠️ Requiere QEMU y emulación lenta. Solo para pruebas.
Bloque de código corregido
# Comando corregido (sin espacios en --net)
docker run --net=host -d -t myimage
# Si falla, ejecuta en primer plano para debug
docker run --net=host -it --rm myimage
# Ver logs si ya se ejecutó en segundo plano
docker logs <container_id>
Pro-tip: Diagnóstico rápido con strace
Si el binario es tuyo y puedes modificar el Dockerfile, incluye strace para rastrear fallos:
RUN apt-get update && apt-get install -y strace
ENTRYPOINT ["strace", "-f", "-o", "/tmp/strace.log", "/tu/binario"]
Luego revisa el log:
docker run --net=host myimage
docker cp <container_id>:/tmp/strace.log ./strace.log
Esto revelará exactamente dónde falla el proceso (ej: open("/lib/libfoo.so") failed).
Top comments (0)