匯出器概覽
匯出器將您的建置結果儲存到指定的輸出類型。您可以使用 --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 指令時,會在映像檔清單中看到它們。
推送到登錄檔
若要將建置好的映像檔推送至容器登錄檔,您可以使用 registry 或 image 匯出器。
當您將 --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> .
將映像檔佈局匯出為檔案
您可以使用 oci 或 docker 匯出器,將建置結果儲存至本機檔案系統上的映像檔佈局。這兩種匯出器都會產生包含對應映像檔佈局的 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
匯出檔案系統
如果您不想從建置結果中建立映像檔,而是想要匯出已建置的檔案系統,可以使用 local 和 tar 匯出器。
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
多個匯出器
您可以透過多次指定 --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=zstd 的 image:
$ docker buildx build \
--output type=image,name=<registry>/<image>,push=true,compression=zstd .
將 compression-level=<value> 選項與 compression 參數搭配使用,可為支援的演算法選擇壓縮等級:
gzip和estargz為 0-9zstd為 0-22
作為一般規則,數字越大,產生的檔案越小,壓縮執行的時間也就越長。
如果您要求的壓縮演算法與先前的壓縮演算法不同,請使用 force-compression=true 選項來強制對從先前映像檔匯入的層進行重新壓縮。
注意
gzip和estargz壓縮方法使用compress/gzip套件,而zstd使用github.com/klauspost/compress/zstd套件。
OCI 媒體類型
image、registry、oci 和 docker 匯出器會建立容器映像檔。這些匯出器同時支援 Docker 媒體類型(預設)和 OCI 媒體類型。
若要匯出設定了 OCI 媒體類型的映像檔,請使用 oci-mediatypes 屬性。
$ docker buildx build \
--output type=image,name=<registry>/<image>,push=true,oci-mediatypes=true .
接下來
閱讀關於每個匯出器的說明,以了解它們如何運作以及如何使用它們。