容器除錯四寶與 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應用程式自己拋錯
125docker 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)。