Docker 容器起不來怎麼辦提示詞(容器立即退出、退出碼含義、端口與網絡不通、掛載目錄權限報錯)
容器啟動後馬上退出、一直重啟、訪問不到端口、掛載的目錄沒有權限、容器之間互相連不上時用:把 docker ps、logs、inspect 的輸出貼給 AI,它根據退出碼和日誌判斷原因,給出逐步驗證的命令和修復方法。
通用大模型 對話模型通用
你是一名熟悉 Docker 和容器網絡的運維工程師。請幫我排查容器問題,按「先看證據、再下結論」的方式進行。 - 現象:[現象](例:容器啟動幾秒後退出,狀態為 Exited 1) - 運行方式:[運行方式](例:docker compose,或 docker run 的完整命令) - 宿主機系統:[宿主機系統](例:Ubuntu、Windows 上的 Docker Desktop) - 已有輸出(容器列表與狀態、容器日誌、inspect 中的關鍵部分、compose 文件): [粘貼輸出] - Dockerfile(如果是自己構建的鏡像): [粘貼 Dockerfile] 分析步驟: 1. 根據退出碼判斷方向:0(主進程正常結束,常見於前台進程寫成了後台運行)、1(應用自身報錯)、126 與 127(命令不可執行或找不到,常見於腳本換行符或路徑問題)、137(被強制終止,常見於內存超限)、139(段錯誤)、143(收到終止信號)。 2. 看日誌:容器已經退出時如何查看最後的日誌;日誌為空時如何用交互方式啟動同一個鏡像進去排查(覆蓋入口命令)。 3. 常見原因逐項檢查: - 主進程不在前台運行,執行完就退出; - 環境變量或配置文件缺失; - Windows 編輯的腳本帶有回車換行符,導致「找不到文件」; - 掛載目錄的屬主與容器內運行用戶不一致,導致沒有權限; - 端口映射寫反、應用只監聽了容器內的本地迴環地址導致外部無法訪問; - 容器之間用 localhost 互相訪問(應該用服務名)、不在同一個網絡; - 依賴的服務(如數據庫)還沒就緒,應用就啟動並失敗退出; - 內存限制過小被終止。 4. 每個判斷給出驗證命令,等我貼回結果再繼續。 5. 給出修復方法:修改 Dockerfile、compose 文件或啟動命令的具體內容。 不要建議用特權模式或關閉安全設定來解決權限問題。
高亮處換成你自己的內容:[現象]、[運行方式]、[宿主機系統]、[粘貼輸出]、[粘貼 Dockerfile]
ChatGPT Plus 充值
已被複製 0 次
使用說明
怎麼填變量:[已有輸出] 最關鍵的是容器狀態裏的退出碼和容器日誌的最後幾十行。用 compose 時把整個 compose 文件貼上,很多網絡和依賴順序問題出在這裏。
常見坑:
- 應用只監聽了 127.0.0.1,在容器內一切正常,從宿主機訪問映射端口卻連不上。要監聽 0.0.0.0。
- 在 compose 中,一個容器用
localhost去連數據庫容器,其實連的是自己。要用數據庫服務的名字作為主機名。 - 「依賴啟動順序」只保證容器啟動的先後,不保證數據庫已經可以接受連接。需要健康檢查加依賴條件,或者在應用中重試連接。
追問技巧:解決後追問「這個鏡像還有哪些可以優化的地方(體積、構建緩存、以非 root 運行)」,可以配合 418 號 Dockerfile 提示詞使用。
示例輸出
示例,僅供參考(現象:容器啟動後立即退出,退出碼 127)
判斷:127 表示「命令找不到」。結合日誌 exec /app/entrypoint.sh: no such file or directory,而文件確實存在,最常見的原因是腳本在 Windows 上編輯過,行尾帶有回車符,導致首行的解釋器路徑被識別成帶回車的路徑。
驗證:
bash
docker run --rm --entrypoint sh myapp:latest -c "head -1 /app/entrypoint.sh | od -c | head -2"
如果輸出中出現 \r,即可確認。
修復:在倉庫中為腳本統一使用 LF 換行(例如通過 .gitattributes 設定),或在 Dockerfile 中轉換:
dockerfile
COPY entrypoint.sh /app/entrypoint.sh
RUN sed -i 's/\r$//' /app/entrypoint.sh && chmod +x /app/entrypoint.sh同款作品
用這條提示詞做出來的作品;原作者會因此獲得積分
還沒有同款,來做第一個。


0 條評論
還沒有評論,來搶沙發~