匯出器概覽

匯出器將您的建置結果儲存到指定的輸出類型。您可以使用 --output CLI 選項來指定要使用的匯出器。Buildx 支援下列匯出器:

  • image:將建置結果匯出至容器映像檔。
  • registry:將建置結果匯出至容器映像檔,並將其推送至指定的登錄檔。
  • local:將建置根檔案系統匯出至本機目錄。
  • tar:將建置根檔案系統打包為本機 tar 壓縮檔。
  • oci:將建置結果匯出至本機檔案系統,格式為 OCI 映像檔佈局
  • docker:將建置結果匯出至本機檔案系統,格式為 Docker 映像檔規格 v1.2.0
  • cacheonly:不匯出建置輸出,但會執行建置並建立快取。

使用匯出器

若要指定匯出器,請使用下列指令語法:

$ docker buildx build --tag <registry>/<image> \
  --output type=<TYPE> .

大多數常見的使用案例不需要您明確指定要使用的匯出器。只有在您打算自訂輸出,或是想要將其儲存到磁碟時,才需要指定匯出器。--load--push 選項允許 Buildx 推斷要使用的匯出器設定。

例如,如果您將 --push 選項與 --tag 結合使用,Buildx 會自動使用 image 匯出器,並將匯出器設定為將結果推送至指定的登錄檔。

若要充分利用 BuildKit 提供的各種匯出器靈活性,請使用 --output 旗標,它可讓您設定匯出器選項。

使用案例

每種匯出器類型皆為不同的使用案例而設計。以下章節描述了一些常見情境,以及您如何利用匯出器來產生所需的輸出。

載入至映像檔儲存庫

Buildx 經常用於建置可載入至映像檔儲存庫的容器映像檔。這就是 docker 匯出器的用途。下列範例示範如何使用 --output 選項,透過 docker 匯出器建置映像檔,並將該映像檔載入至本機映像檔儲存庫:

$ docker buildx build \
  --output type=docker,name=<registry>/<image> .

如果您提供了 --tag--load 選項,Buildx CLI 將自動使用 docker 匯出器並將其載入至映像檔儲存庫。

$ docker buildx build --tag <registry>/<image> --load .

使用 docker 驅動程式建置的映像檔會自動載入至本機映像檔儲存庫。

載入至映像檔儲存庫的映像檔在建置完成後即可立即用於 docker run,且當您執行 docker images 指令時,會在映像檔清單中看到它們。

推送到登錄檔

若要將建置好的映像檔推送至容器登錄檔,您可以使用 registryimage 匯出器。

當您將 --push 選項傳遞給 Buildx CLI 時,即指示 BuildKit 將建置好的映像檔推送至指定的登錄檔。

$ docker buildx build --tag <registry>/<image> --push .

在底層,這會使用 image 匯出器並設定 push 參數。這與使用 --output 選項的以下長格式指令相同:

$ docker buildx build \
  --output type=image,name=<registry>/<image>,push=true .

您也可以使用同樣具備此功能的 registry 匯出器:

$ docker buildx build \
  --output type=registry,name=<registry>/<image> .

將映像檔佈局匯出為檔案

您可以使用 ocidocker 匯出器,將建置結果儲存至本機檔案系統上的映像檔佈局。這兩種匯出器都會產生包含對應映像檔佈局的 tar 壓縮檔。dest 參數定義了 tar 壓縮檔的目標輸出路徑。

$ docker buildx build --output type=oci,dest=./image.tar .
[+] Building 0.8s (7/7) FINISHED
 ...
 => exporting to oci image format                                                                     0.0s
 => exporting layers                                                                                  0.0s
 => exporting manifest sha256:c1ef01a0a0ef94a7064d5cbce408075730410060e253ff8525d1e5f7e27bc900        0.0s
 => exporting config sha256:eadab326c1866dd247efb52cb715ba742bd0f05b6a205439f107cf91b3abc853          0.0s
 => sending tarball                                                                                   0.0s
$ mkdir -p out && tar -C out -xf ./image.tar
$ tree out
out
├── blobs
│   └── sha256
│       ├── 9b18e9b68314027565b90ff6189d65942c0f7986da80df008b8431276885218e
│       ├── c78795f3c329dbbbfb14d0d32288dea25c3cd12f31bd0213be694332a70c7f13
│       ├── d1cf38078fa218d15715e2afcf71588ee482352d697532cf316626164699a0e2
│       ├── e84fa1df52d2abdfac52165755d5d1c7621d74eda8e12881f6b0d38a36e01775
│       └── fe9e23793a27fe30374308988283d40047628c73f91f577432a0d05ab0160de7
├── index.json
├── manifest.json
└── oci-layout

匯出檔案系統

如果您不想從建置結果中建立映像檔,而是想要匯出已建置的檔案系統,可以使用 localtar 匯出器。

local 匯出器會將檔案系統解壓縮至指定位置的目錄結構中。tar 匯出器則會建立一個 tar 壓縮檔。

$ docker buildx build --output type=local,dest=<path/to/output> .

local 匯出器在多階段建置 (multi-stage builds)中很有用,因為它允許您只匯出最少量的建置成品,例如獨立的二進位檔案。

僅快取匯出

如果您只想執行建置而不匯出任何輸出,可以使用 cacheonly 匯出器。這在例如執行測試建置時非常有用。或者,如果您想先執行建置,再透過後續指令建立匯出結果。cacheonly 匯出器會建立建置快取,因此任何後續的建置都會是瞬間完成的。

$ docker buildx build --output type=cacheonly

如果您未指定匯出器,且未提供如 --load 這類會自動選取適當匯出器的快捷選項,Buildx 預設會使用 cacheonly 匯出器。但如果您使用 docker 驅動程式進行建置,則會使用 docker 匯出器。

當使用 cacheonly 作為預設值時,Buildx 會記錄一條警告訊息。

$ docker buildx build .
WARNING: No output specified with docker-container driver.
         Build result will only remain in the build cache.
         To push result image into registry use --push or
         to load image into docker use --load

多個匯出器

需求: Docker Buildx 0.13.0 或更高版本

您可以透過多次指定 --output 旗標,對任何給定的建置使用多個匯出器。這要求 Buildx 與 BuildKit 版本皆為 0.13.0 或更高。

下列範例執行一次建置,同時使用三個不同的匯出器:

  • 使用 registry 匯出器將映像檔推送至登錄檔。
  • 使用 local 匯出器將建置結果解壓縮至本機檔案系統。
  • 使用 --load 旗標(image 匯出器的快捷方式)將結果載入至本機映像檔儲存庫。
$ docker buildx build \
  --output type=registry,tag=<registry>/<image> \
  --output type=local,dest=<path/to/output> \
  --load .

配置選項

本節描述匯出器可用的一些設定選項。

此處描述的選項對於至少兩個或更多匯出器類型來說是通用的。此外,不同的匯出器類型也支援特定的參數。請參閱關於每個匯出器的詳細頁面,以取得哪些設定參數適用的更多資訊。

此處描述的通用參數為:

壓縮

當您匯出壓縮輸出時,可以設定要使用的確切壓縮演算法與等級。雖然預設值提供了良好的開箱即用體驗,但您也可以調整參數,以在儲存空間與運算成本之間進行最佳化。變更壓縮參數可以減少所需的儲存空間並提升映像檔下載速度,但會增加建置時間。

若要選擇壓縮演算法,可以使用 compression 選項。例如,建置一個使用 compression=zstdimage

$ docker buildx build \
  --output type=image,name=<registry>/<image>,push=true,compression=zstd .

compression-level=<value> 選項與 compression 參數搭配使用,可為支援的演算法選擇壓縮等級:

  • gzipestargz 為 0-9
  • zstd 為 0-22

作為一般規則,數字越大,產生的檔案越小,壓縮執行的時間也就越長。

如果您要求的壓縮演算法與先前的壓縮演算法不同,請使用 force-compression=true 選項來強制對從先前映像檔匯入的層進行重新壓縮。

注意

gzipestargz 壓縮方法使用 compress/gzip 套件,而 zstd 使用 github.com/klauspost/compress/zstd 套件

OCI 媒體類型

imageregistryocidocker 匯出器會建立容器映像檔。這些匯出器同時支援 Docker 媒體類型(預設)和 OCI 媒體類型。

若要匯出設定了 OCI 媒體類型的映像檔,請使用 oci-mediatypes 屬性。

$ docker buildx build \
  --output type=image,name=<registry>/<image>,push=true,oci-mediatypes=true .

接下來

閱讀關於每個匯出器的說明,以了解它們如何運作以及如何使用它們。

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