Erreurs

❌ Erreur Docker/Proxmox "Docker Container Exit Code non-zéro" — Causes et Solutions

🐳 Docker / Proxmox

Un container Docker s'arrête immédiatement avec un code d'erreur

🐳 Docker/Proxmox 📋 6 causes 🔧 5 solutions
Quand un container Docker démarre puis s'arrête immédiatement avec un exit code non-zéro, c'est que le processus principal du container a rencontré une erreur. Chaque code d'exit a une signification précise et oriente le diagnostic.

⚠️ Causes possibles

⚠️
Exit code 1 — erreur applicative
Le programme principal a rencontré une erreur (config manquante, bug, exception)
⚠️
Exit code 137 — OOMKilled
Le kernel a tué le container car il dépassait la limite mémoire (Out Of Memory)
⚠️
Exit code 139 — Segfault
Le processus a causé une violation d'accès mémoire (segmentation fault)
⚠️
Exit code 125, 126, 127
Erreur Docker lui-même : image invalide, commande non trouvée, permission refusée
⚠️
Entrypoint ou CMD incorrect
La commande de démarrage définie dans le Dockerfile n'existe pas ou échoue
⚠️
Variables d'environnement manquantes
L'application requiert des variables d'env non fournies au container

🔧 Solutions étape par étape

1

Lire les logs du container

terminal
# Voir les logs du dernier container (arrêté)
docker logs 
docker logs $(docker ps -lq)  # Dernier container

# Logs en temps réel pendant le démarrage
docker logs -f 

# Logs des 100 dernières lignes
docker logs --tail 100 

# Voir les logs horodatés
docker logs --timestamps 

# Voir le code de sortie
docker inspect  --format='{{.State.ExitCode}}'
docker inspect  --format='{{.State.Error}}'

# Voir si OOMKilled
docker inspect  --format='{{.State.OOMKilled}}'
2

Déchiffrer les codes d'exit

terminal
# Exit code 0  → Succès (arrêt normal)
# Exit code 1  → Erreur générale (voir docker logs)
# Exit code 2  → Mauvaise utilisation de la commande shell
# Exit code 125 → Docker lui-même a échoué
# Exit code 126 → Commande non exécutable (permissions)
# Exit code 127 → Commande introuvable dans le container
# Exit code 130 → Terminé par Ctrl+C (SIGINT)
# Exit code 137 → Tué par le kernel (OOM ou SIGKILL)
# Exit code 139 → Segmentation fault (SIGSEGV)
# Exit code 143 → Tué proprement (SIGTERM)
# Exit code 255 → Erreur de sortie générique

# Commande pratique pour voir le dernier exit code
docker inspect --format='ExitCode={{.State.ExitCode}} OOMKilled={{.State.OOMKilled}}'   $(docker ps -lq)
3

Déboguer un container qui s'arrête

terminal
# Remplacer l'entrypoint pour ouvrir un shell de debug
docker run -it --entrypoint /bin/sh mon-image
# ou
docker run -it --entrypoint /bin/bash mon-image

# Lancer avec un sleep pour avoir le temps d'inspecter
docker run -it --entrypoint sleep mon-image 3600
# Puis dans un autre terminal :
docker exec -it  /bin/sh

# Voir les variables d'environnement du container
docker inspect  --format='{{range .Config.Env}}{{.}}
{{end}}'

# Voir les volumes montés
docker inspect  --format='{{json .Mounts}}'
4

Corriger un OOMKill (Exit 137)

terminal
# Vérifier si le container a été OOMKilled
docker inspect  | grep OOMKilled
# Si "OOMKilled": true → manque de mémoire

# Voir les stats mémoire du container
docker stats  --no-stream

# Augmenter la limite mémoire
docker run --memory="512m" --memory-swap="1g" mon-image

# Dans docker-compose.yml
services:
  webapp:
    image: mon-image
    deploy:
      resources:
        limits:
          memory: 512M
        reservations:
          memory: 256M

# Voir les messages OOM dans les logs système
dmesg | grep -i "oom\|kill" | tail -20
journalctl -k | grep -i oom | tail -20
5

Corriger les variables d'environnement manquantes

terminal
# Passer les variables d'environnement
docker run -e DB_HOST=192.168.1.10 -e DB_PORT=5432 mon-image

# Via un fichier .env
docker run --env-file .env mon-image

# Dans docker-compose.yml
services:
  webapp:
    image: mon-image
    environment:
      - DB_HOST=192.168.1.10
      - DB_PORT=5432
      - DB_NAME=mabase
    env_file:
      - .env

# Vérifier les variables requises dans le Dockerfile
# Chercher les ENV et ARG dans le Dockerfile
grep -E "^ENV|^ARG" Dockerfile

🛡️ Comment éviter cette erreur

  • ✅ Toujours lire docker logs container_id en premier réflexe quand un container s'arrête
  • ✅ Configurer des health checks dans le Dockerfile : HEALTHCHECK CMD curl -f http://localhost/ || exit 1
  • ✅ Définir des limites mémoire explicites pour éviter les OOMKill : --memory=512m
  • ✅ Utiliser docker run --restart=on-failure:3 pour les services critiques en production
Ajouter Les Fibrés à mes sources préférées
Retrouvez plus souvent nos guides dans vos résultats Google