快取儲存後端

為了確保建置速度,BuildKit 會自動將建置結果快取在其內部的快取中。此外,BuildKit 也支援將建置快取匯出至外部位置,以便在未來的建置中匯入。

外部快取對於 CI/CD 建置環境幾乎是必需的。這類環境通常在執行之間幾乎沒有持久性儲存,但保持映像建置執行時間盡可能短仍然很重要。

預設的 docker 驅動程式支援 inlinelocalregistrygha 快取後端,但前提是您必須啟用 containerd 映像儲存。其他快取後端需要您選擇不同的 驅動程式

警告

如果您在建置過程中使用了機密 (secrets) 或憑證,請確保使用專用的 --secret 選項來處理它們。手動使用 COPYARG 管理機密可能會導致憑證洩漏。

後端

Buildx 支援下列快取儲存後端

  • inline:將建置快取嵌入到映像中。

    內嵌快取會被推送到與主要輸出結果相同的位置。這僅適用於 image 匯出器

  • registry:將建置快取嵌入到單獨的映像中,並推送到與主要輸出位置分開的專用位置。

  • local:將建置快取寫入檔案系統上的本機目錄。

  • gha:將建置快取上傳至 GitHub Actions 快取 (測試階段)。

  • s3:將建置快取上傳至 AWS S3 儲存貯體 (尚未發布)。

  • azblob:將建置快取上傳至 Azure Blob Storage (尚未發布)。

指令語法

要使用任何快取後端,您首先需要在建置時使用 --cache-to 選項指定它,以便將快取匯出到您選擇的儲存後端。然後,使用 --cache-from 選項從儲存後端將快取匯入到當前的建置中。與始終啟用的本機 BuildKit 快取不同,所有快取儲存後端都必須明確進行匯出與匯入。

使用 registry 後端進行匯入與匯出快取的範例 buildx 指令

$ docker buildx build --push -t <registry>/<image> \
  --cache-to type=registry,ref=<registry>/<cache-image>[,parameters...] \
  --cache-from type=registry,ref=<registry>/<cache-image>[,parameters...] .
警告

一般原則是,每個快取都會寫入到某個位置。如果沒有覆寫先前快取的資料,則任何位置都不能寫入兩次。如果您想要維護多個作用域的快取(例如,每個 Git 分支一個快取),請確保為匯出的快取使用不同的位置。

多重快取

BuildKit 支援多個快取匯出器,允許您將快取推送到多個目的地。您也可以根據需要從任意數量的遠端快取匯入。例如,一種常見的模式是同時使用當前分支和主分支的快取。以下範例顯示如何使用 registry 快取後端從多個位置匯入快取

$ docker buildx build --push -t <registry>/<image> \
  --cache-to type=registry,ref=<registry>/<cache-image>:<branch> \
  --cache-from type=registry,ref=<registry>/<cache-image>:<branch> \
  --cache-from type=registry,ref=<registry>/<cache-image>:main .

配置選項

本節說明在產生快取匯出時可用的一些配置選項。此處說明的選項對於至少兩個或多個後端類型是通用的。此外,不同的後端類型也支援特定的參數。有關哪些配置參數適用的詳細資訊,請參閱關於每個後端類型的詳細說明頁面。

此處說明的一般參數為

快取模式

在產生快取輸出時,--cache-to 引數接受一個 mode 選項,用於定義在匯出的快取中包含哪些層。除了 inline 快取之外,所有快取後端都支援此功能。

模式可以設定為兩個選項之一:mode=minmode=max。例如,若要使用 registry 後端以 mode=max 建置快取

$ docker buildx build --push -t <registry>/<image> \
  --cache-to type=registry,ref=<registry>/<cache-image>,mode=max \
  --cache-from type=registry,ref=<registry>/<cache-image> .

此選項僅在匯出快取時使用 --cache-to 設定。在匯入快取 (--cache-from) 時,相關參數會自動偵測。

min 快取模式下(預設),僅會快取匯出到結果映像中的層,而在 max 快取模式下,所有層都會被快取,即使是中間步驟的層也是如此。

雖然 min 快取通常較小(這會加快匯入/匯出時間並降低儲存成本),但 max 快取更有可能獲得更多的快取命中。根據您建置的複雜度和位置,您應該嘗試這兩個參數,以找出最適合您的結果。

快取壓縮

快取壓縮選項與 匯出器壓縮選項相同。localregistry 快取後端支援此功能。

例如,若要使用 zstd 壓縮來壓縮 registry 快取

$ docker buildx build --push -t <registry>/<image> \
  --cache-to type=registry,ref=<registry>/<cache-image>,compression=zstd \
  --cache-from type=registry,ref=<registry>/<cache-image> .

OCI 媒體類型

快取 OCI 選項與 匯出器 OCI 選項相同。localregistry 快取後端支援這些選項。

例如,若要匯出 OCI 媒體類型快取,請使用 oci-mediatypes 屬性

$ docker buildx build --push -t <registry>/<image> \
  --cache-to type=registry,ref=<registry>/<cache-image>,oci-mediatypes=true \
  --cache-from type=registry,ref=<registry>/<cache-image> .

此屬性僅在使用 --cache-to 旗標時才有意義。擷取快取時,BuildKit 會自動偵測要使用的正確媒體類型。

預設情況下,OCI 媒體類型會為快取映像產生一個映像索引。某些 OCI 登錄 (registry),例如 Amazon ECR,不支援映像索引媒體類型:application/vnd.oci.image.index.v1+json。如果您將快取映像匯出到 ECR 或任何其他不支援映像索引的登錄,請將 image-manifest 參數設定為 true,以便為快取映像產生單一映像資訊清單 (image manifest) 而非映像索引

$ docker buildx build --push -t <registry>/<image> \
  --cache-to type=registry,ref=<registry>/<cache-image>,oci-mediatypes=true,image-manifest=true \
  --cache-from type=registry,ref=<registry>/<cache-image> .
注意

從 BuildKit v0.21 開始,預設啟用 image-manifest

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.