Cómo solucionar docker run con exit code 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 usaarmhfoarm64. -
Falta de binarios nativos: El
ENTRYPOINT/CMDdel contenedor intenta ejecutar un binario compilado para otra arquitectura. - Problemas de permisos en dispositivos del sistema (especialmente en Raspberry Pi OS Lite o sin entorno gráfico).
- Falta de memoria o recursos insuficientes (menos común, pero posible en dispositivos con poca RAM).
El hecho de que funcione en una VM pero no en hardware físico confirma fuertemente un problema de arquitectura.
Pasos para solucionarlo
1. Verifica la arquitectura del host y de la imagen
# En tu Raspberry Pi:
uname -m
# Salida esperada: armv7l (32-bit) o aarch64 (64-bit)
docker images myimage
# Busca la columna "ARCHITECTURE" (si está disponible)
docker inspect myimage | grep -i architecture
# Salida esperada: "Architecture": "arm" o "arm64"
2. Si la imagen no es compatible: reconstrúyela para ARM
Opción A: Usa docker buildx (recomendado)
# Habilita buildx
docker buildx create --use
# Construye para la arquitectura correcta
docker buildx build \
--platform linux/arm/v7,linux/arm64 \
--push \
-t tu-usuario/myimage:latest \
.
⚠️ Si tu imagen depende de binarios nativos (ej.
.so, ejecutables precompilados), asegúrate de que estén disponibles para ARM.
Opción B: Usa una imagen base compatible
En tu Dockerfile, cambia la imagen base a una versión ARM:
# En lugar de:
FROM node:18-alpine
# Usa:
FROM arm32v7/node:18-alpine # Para Raspberry Pi 3/4 32-bit
# O
FROM arm64v8/node:18-alpine # Para Raspberry Pi 4/5 64-bit
3. Ejecuta en primer plano para diagnosticar
docker run --net=host -t myimage
# Quita la opción -d para ver logs en tiempo real
Si ves errores como Exec format error, es confirmación definitiva de incompatibilidad de arquitectura.
4. Verifica que el comando de inicio sea válido
Algunas imágenes usan ENTRYPOINT que requiere shell. Si el contenedor falla por no such file or directory, agrega --entrypoint=/bin/sh:
docker run --net=host -t --entrypoint=/bin/sh myimage -c "echo 'test' && ls -la /"
Bloque de código corregido (ejemplo funcional)
# Dockerfile corregido para Raspberry Pi
FROM arm32v7/python:3.9-slim
WORKDIR /app
COPY . .
# Asegura que el script sea ejecutable
RUN chmod +x /app/start.sh
# Usa shell para evitar problemas de PATH
ENTRYPOINT ["/bin/sh", "-c", "/app/start.sh"]
Y luego:
# Construcción para ARM
docker buildx build --platform linux/arm/v7 -t myimage:latest .
# Ejecución corregida (sin espacios en `--net=host`)
docker run --net=host -d -t myimage:latest
🔥 Nota crítica: En tu comando original hay un error tipográfico:
--net = host(con espacios) es inválido. Debe ser--net=host(sin espacios alrededor del=).
Pro-tip: Diagnóstico rápido con docker run --rm
docker run --rm --net=host -t myimage 2>&1 | tee /tmp/container.log
Esto ejecuta el contenedor en primer plano, lo elimina automáticamente al terminar (--rm) y guarda los logs para análisis.
Si el problema persiste, revisa:
-
dmesg | grep -i segfault(para detectar fallos de segmentación por arquitectura) -
file /usr/bin/python3dentro del contenedor (si puedes acceder con--entrypoint=/bin/sh) para confirmar arquitectura del binario.
Top comments (0)