全部產品
Search
文件中心

Container Registry:鏡像構建診斷

更新時間:May 10, 2025

診斷分析提供了構建診斷功能,協助您識別鏡像構建過程中出現的異常、潛在風險和最佳化項。本文將介紹構建診斷的檢查項及相應的修複方案。

鏡像構建診斷概述

鏡像構建診斷功能結合了專家經驗和通義千問大模型的能力,形成一種基於專家知識和人工智慧的雙重診斷模式,旨在深入定位問題根因並提供修改建議。

重要

使用鏡像構建診斷功能時,將採集您的容器鏡像倉庫執行個體的相關資料資訊,採集的資訊包括鏡像倉庫執行個體資訊、鏡像構建配置資訊、構建任務的日誌資訊和鏡像構建記錄。請勿將您的敏感性資料儲存在鏡像構建配置或輸出至構建任務日誌中。詳情請參見使用須知

診斷功能包含兩個主要部分:

  • 規則檢測:主要包括指令檢查和錯誤記錄檔分析。

  • 診斷根因:包括定位到的根因以及修複建議。

    通過收集容器鏡像倉庫執行個體的相關資料並識別異常情況,進行深入的異常診斷以確定問題的根源並提出相應的解決方案。

診斷流程

鏡像構建診斷先收集容器鏡像倉庫執行個體所需的相關資料後,然後進行深入的異常診斷。發起診斷後,診斷流程分為三個階段:

  • 資料預先處理:採集診斷所需資料,例如執行個體狀態、倉庫配置、構建規則資訊、構建日誌等並快速分析構建存在的異常。

  • 規則檢測:根據採集到的資料,分析構建中存在的異常、潛在的風險項和可最佳化項。

  • 根因分析:根據採集的資料和檢測項,自動分析導致問題的原因和修複建議。

image

診斷結果

診斷結果包括兩部分:

  • 待修複項:包括異常根因、修複建議和異常定位。

  • AI智能診斷:根據異常詳情,對構建指令或配置項進行深入分析,提供更全面的最佳化建議。

查看診斷規則及修複建議

  1. 鏡像構建診斷頁面,單擊診斷。然後在選擇構建鏡像任務頁面,通過以下參數選擇需要診斷的鏡像構建任務ID。

    • 命名空間:鏡像構建任務所屬的命名空間。

    • 鏡像倉庫:鏡像構建任務所屬的鏡像倉庫。

    • 鏡像構建任務ID:鏡像構建任務ID號。

    選擇完成後,仔細閱讀注意事項後勾選我已知曉並同意,然後單擊發起診斷

  2. 診斷完成後,您可以根據頁面上的修複建議進行相應操作。以下是常見的診斷規則、異常根因及修複建議。

    診斷規則群組

    診斷規則名稱

    異常根因

    修複建議

    Dockerfile文法檢測

    非法連接埠定義

    EXPOSE指令的連接埠或協議格式不正確。

    使用EXPOSE暴露連接埠時,連接埠範圍應在0~65535,協議為TCP或UDP。

    拷貝指令文法檢測

    拷貝多個檔案時,目的地址不是目錄。

    確保目的路徑格式為目錄位址。

    構建階段不存在

    COPY指定的階段名不存在。

    確保階段名是之前定義的階段。

    重複的階段名稱

    使用了重複的階段名。

    避免使用重複的階段名。

    首條指令不合法

    首條指令不為FROMARG指令。

    確保首條指令為FROMARG指令。

    編譯錯誤項

    Dockerfile先行編譯錯誤。

    請修正Dockerfile中的語法錯誤,或等待根因分析給出修改意見。

    編譯警告項

    Dockerfile先行編譯警告。

    請注意Dockerfile中的相關指令,可能會以非預期的方式運行。

    鏡像版本檢測

    未指定基礎鏡像版本

    未指定明確的鏡像版本。

    可能會導致構建時使用非預期的鏡像版本,從而影響構建結果,建議指定明確的鏡像版本。

    基礎鏡像不存在

    基礎鏡像名稱有誤或不存在。

    檢查基礎鏡像名稱或重新選擇一個存在的基礎鏡像。

    運行階段錯誤偵測

    命令運行錯誤

    命令列運行錯誤。

    請檢查在Dockerfile中指定啟動並執行命令是否正確,或等待根因分析給出的修複建議。

    命令不存在

    啟動並執行命令不存在。

    請確保基礎鏡像中存在Dockerfile中指定的運行命令。

    檔案不存在

    檔案拷貝錯誤。

    請檢查Dockerfile中COPY命令對應的檔案或目錄是否存在。

    非法指令檢測

    非法命令檢測

    在構建過程中使用了KillShutdown等不支援的指令。

    在構建過程中使用KillShutdown等指令會導致安全及穩定性問題,需要去除相關指令。

    sudo命令檢測

    在構建中使用sudo命令是無效的。

    去除構建中的sudo指令。

    上傳階段錯誤偵測

    版本衝突

    鏡像版本與倉庫已有鏡像版本衝突。

    鏡像版本衝突,請關閉倉庫的鏡像版本不可變功能,或確保相同版本的鏡像不會被重複推送。

    鏡像體積最佳化項檢測

    apt get指令可最佳化項

    構建指令中的apt updateapt install指令分離。

    apt updateapt install指令分散在不同指令中可能會導致鏡像體積增大,重複構建效率降低。

    apt get指令可最佳化項

    apt-get install未添加--no-install-recommends參數。

    使用apt-get install時加入--no-install-recommends參數有助於減小鏡像體積。

    包安裝指令可最佳化項

    安裝軟體包後未清除緩衝。

    在安裝軟體包後清除緩衝有助於減小鏡像體積,如Ubuntu使用apt-get clean指令,Alpine在apk add指令中加入--no-cache和rm -rf /var/cache/apk/*指令,CentOS使用yum clean指令。

    分階段編譯檢測

    未使用多階段構建最佳化編譯指令。

    將編譯指令放入單獨的階段進行編譯,將編譯結果拷貝進入業務鏡像,可以縮小鏡像體積。

    存在冗餘壓縮包

    構建使用的壓縮包未清除。

    將下載壓縮包、解壓壓縮包和刪除壓縮包指令合并在同一條RUN指令中執行,可縮小鏡像體積。

    構建指令最佳化檢測

    相對路徑檢測

    WORKDIR使用相對路徑。

    使用相對路徑時,可能會切換到非預期的工作目錄,導致構建失敗,建議確認WORKDIR路徑是否正確或使用絕對路徑。

    根使用者檢測

    在構建中切換到Root使用者。

    在構建中切換到Root使用者,會導致容器在運行時存在安全性問題,需要去除相關指令。

    路徑切換最佳化檢測

    在構建過程中使用cd指令。

    在構建中使用cd指令指定工作目錄不會在容器運行時生效,推薦使用WORKDIR指令。

    CMDENTRYPOINT覆蓋檢測

    在構建過程中使用多條CMD指令或ENTRYPOINT指令。

    使用多條CMDENTRYPOINT指令時只有最後一條指令會生效,確保最後一條指令為預期使用的指令。