疑難排解
以下是您在遷移至或使用 Docker 強固映像檔 (DHI) 時可能會遇到的常見問題,以及建議的解決方案。
一般偵錯
Docker 強固映像檔針對安全性和執行階段效能進行了最佳化。因此,它們通常不包含 shell 或標準偵錯工具。針對建構在 DHI 上的容器,推薦的疑難排解方式是使用 Docker Debug。
Docker Debug 允許您:
- 將暫時性偵錯容器附加至現有的容器。
- 使用 shell 和熟悉的工具,例如
curl、ps、netstat和strace。 - 視需要於一個可寫入的暫時層中安裝額外工具,該層會在工作階段結束後消失。
權限
為了提升安全性,DHI 預設以非 root 使用者身分執行。這可能會在存取檔案或目錄時導致權限問題。請確保您的應用程式檔案和執行階段目錄由預期的 UID/GID 所擁有,或具有適當的權限。
若要查詢 DHI 是以哪位使用者身分執行,請查看 Docker Hub 上該映像檔的儲存庫頁面。更多資訊請參閱檢視映像檔變體詳情 (View image variant details)。
特權連接埠
預設情況下,非 root 容器無法繫結至 1024 以下的連接埠。此限制由容器執行階段和核心強制執行(特別是在 Kubernetes 和 Docker Engine < 20.10 的環境中)。
請在容器內部設定應用程式監聽非特權連接埠(1025 或更高)。例如,docker run -p 80:8080 my-image 會將容器內的 8080 連接埠對映至主機的 80 連接埠,讓您無需 root 權限即可存取。
無 Shell
執行階段的 DHI 省略了互動式 shell(如 sh 或 bash)。如果您的建置流程或工具假設系統內存在 shell(例如用於 RUN 指令),請在較早的建置階段中使用映像檔的 dev 變體,並將最終產物複製到執行階段映像檔中。
若要查詢 DHI 包含哪種 shell(如果有的話),請查看 Docker Hub 上該映像檔的儲存庫頁面。更多資訊請參閱檢視映像檔變體詳情 (View image variant details)。
此外,當您需要對執行中的容器進行 shell 存取時,請使用 Docker Debug。
進入點差異
相較於 Docker 官方映像檔 (DOI) 或其他社群映像檔,DHI 可能定義了不同的進入點 (entry point)。
若要查詢 DHI 的 ENTRYPOINT 或 CMD,請查看 Docker Hub 上該映像檔的儲存庫頁面。更多資訊請參閱檢視映像檔變體詳情 (View image variant details)。
無套件管理員
執行階段的 Docker 強固映像檔為了安全性和最小化攻擊面經過精簡。因此,它們不包含像 apk 或 apt 這樣的套件管理員。這意味著您無法直接在執行階段映像檔中安裝額外軟體。
如果您的建置或應用程式設定需要安裝套件(例如為了編譯程式碼、安裝執行階段依賴項或加入診斷工具),請在建置階段使用映像檔的 dev 變體。接著,僅將必要的產物複製到最終的執行階段映像檔中。