容器除錯四寶與 exit code 對照
容器出問題時不能像本機程式那樣直接看,這四個指令是你的眼睛,要練到反射動作。
docker logs -f --tail 50 my-app # ① 最常用組合
docker exec -it my-app sh # ② 進去看(alpine 沒有 bash)
docker inspect -f '{{.State.ExitCode}}' my-app # ③ 怎麼死的
docker stats # ④ 誰在吃資源容器啟動後馬上就掛:docker ps 看不到但 docker ps -a 看得到(Exited),這時 docker logs 依然讀得到它死前的遺言——九成問題在這裡就找到答案。
⚠️ exec 進去改的東西不會保存,下次 docker run 的新容器也不會有。exec 只適合診斷,不是修改的手段——真要改就改 Dockerfile 重 build。
Exit code
| Code | 意思 |
|---|---|
| 0 | 正常結束(程式跑完了) |
| 1 | 應用程式自己拋錯 |
| 125 | docker run 指令本身參數寫錯 |
| 126 | 指令找到了但不能執行(權限) |
| 127 | 指令找不到(CMD 打錯,或 alpine 沒有 bash) |
| 137 | 被 SIGKILL 砍死,通常是記憶體超限被 OOMKilled |
| 143 | 被 SIGTERM 正常終止(docker stop) |
137 確認法:docker inspect -f '{{.State.OOMKilled}}' <name> → true 就中了。解法是調高 --memory 或修應用程式;Mac 還要檢查 Docker Desktop 分配給 VM 的記憶體。
標準除錯流程
docker ps -a(在不在?)→ docker logs --tail 100(死前說了什麼?)→ inspect 看 exit code(怎麼死的?)→ exec 進去看檔案與環境變數 → docker stats(是不是資源不夠被砍)。
Exited (0) 通常不是錯誤:容器的生命 = 它主行程的生命,主行程結束容器就 exit(docker run ubuntu 立刻停就是因為 shell 沒事做,要互動得加 -it)。