docker buildx build

描述啟動構建
用法docker buildx build [OPTIONS] PATH | URL | -
別名
docker build docker builder build docker image build docker buildx b

描述

docker buildx build 命令使用 BuildKit 啟動構建。

選項

選項預設值描述
--add-host新增自定義主機到 IP 對映(格式:host:ip
--allow允許額外的特權授權(例如,network.hostsecurity.insecure
--annotation向映象添加註解
--attest證明引數(格式:type=sbom,generator=image
--build-arg設定構建時變數
--build-context額外的構建上下文(例如,name=path)
--cache-from外部快取源(例如,user/app:cachetype=local,src=path/to/dir
--cache-to快取匯出目的地(例如,user/app:cachetype=local,dest=path/to/dir
--callbuild設定評估構建的方法(checkoutlinetargets
--cgroup-parent設定構建期間 RUN 指令的父 cgroup
--check--call=check 的簡寫
-f, --fileDockerfile 的名稱(預設:PATH/Dockerfile
--iidfile將映象 ID 寫入檔案
--label為映象設定元資料
--load--output=type=docker 的簡寫
--metadata-file將構建結果元資料寫入檔案
--network設定構建期間 RUN 指令的網路模式
--no-cache構建映象時不使用快取
--no-cache-filter不快取指定階段
-o, --output輸出目的地(格式:type=local,dest=path
--platform設定構建的目標平臺
--progressauto設定進度輸出型別(autoquietplainttyrawjson)。使用 plain 顯示容器輸出
--provenance--attest=type=provenance 的簡寫
--pull始終嘗試拉取所有引用的映象
--push--output=type=registry 的簡寫
-q, --quiet抑制構建輸出並在成功時列印映象 ID
--sbom--attest=type=sbom 的簡寫
--secret暴露給構建的秘密(格式:id=mysecret[,src=/local/secret]
--shm-size構建容器的共享記憶體大小
--ssh暴露給構建的 SSH 代理套接字或金鑰(格式:default|<id>[=<socket>|<key>[,<key>]]
-t, --tag名稱和可選的標籤(格式:name:tag
--target設定要構建的目標構建階段
--ulimitUlimit 選項

示例

向容器主機檔案新增條目(--add-host)

您可以使用一個或多個 --add-host 標誌向構建容器的 /etc/hosts 檔案新增其他主機。此示例為名為 my-hostnamemy_hostname_v6 的主機新增靜態地址。

$ docker buildx build --add-host my_hostname=8.8.8.8 --add-host my_hostname_v6=2001:4860:4860::8888 .

如果您的構建需要連線到主機上執行的服務,您可以對 --add-host 使用特殊的 host-gateway 值。在以下示例中,構建容器會將 host.docker.internal 解析為主機的閘道器 IP。

$ docker buildx build --add-host host.docker.internal=host-gateway .

您可以將 IPv6 地址括在方括號中。=: 都是有效的分隔符。以下示例中的兩種格式都有效

$ docker buildx build --add-host my-hostname:10.180.0.1 --add-host my-hostname_v6=[2001:4860:4860::8888] .

建立註解(--annotation)

--annotation="key=value"
--annotation="[type:]key=value"

向映象索引、清單或描述符新增 OCI 註解。以下示例向映象清單新增 foo=bar 註解

$ docker buildx build -t TAG --annotation "foo=bar" --push .

您可以選擇新增型別字首來指定註解的級別。預設情況下,映象清單會被註解。以下示例向映象索引而不是清單新增 foo=bar 註解

$ docker buildx build -t TAG --annotation "index:foo=bar" --push .

您可以指定多個型別,用逗號 (,) 分隔,將註解新增到多個映象元件。以下示例向映象索引、描述符、清單新增 foo=bar 註解

$ docker buildx build -t TAG --annotation "index,manifest,manifest-descriptor:foo=bar" --push .

您還可以在型別字首中指定方括號中的平臺限定符([os/arch]),以將註解應用於具有匹配平臺的清單子集。以下示例僅向具有 linux/amd64 平臺的清單新增 foo=bar 註解

$ docker buildx build -t TAG --annotation "manifest[linux/amd64]:foo=bar" --push .

平臺限定符不支援萬用字元;您不能指定像 manifest[linux/*] 這樣的型別字首來僅向以 linux 作為 OS 平臺的清單添加註解。

有關注解的更多資訊,請參閱註解

建立證明(--attest)

--attest=type=sbom,...
--attest=type=provenance,...

建立映象證明。BuildKit 目前支援

  • sbom - 軟體物料清單。

    使用 --attest=type=sbom 在構建時為映象生成 SBOM。或者,您可以使用--sbom 簡寫

    有關更多資訊,請參閱此處

  • provenance - SLSA 出處

    使用 --attest=type=provenance 在構建時為映象生成出處。或者,您可以使用--provenance 簡寫

    預設情況下,將為構建結果建立一個最小的出處證明,該證明僅附加到推送到登錄檔的映象。

    有關更多資訊,請參閱此處

允許額外的特權授權(--allow)

--allow=ENTITLEMENT

允許額外的特權授權。授權列表

  • network.host - 允許使用主機網路執行。
  • security.insecure - 允許在沒有沙盒的情況下執行。請參閱相關 Dockerfile 擴充套件

要啟用授權,BuildKit 守護程式還需要使用 --allow-insecure-entitlement 允許它們(請參閱create --buildkitd-flags)。

$ docker buildx create --use --name insecure-builder --buildkitd-flags '--allow-insecure-entitlement security.insecure'
$ docker buildx build --allow security.insecure .

設定構建時變數(--build-arg)

您可以在 Dockerfile 中使用 ENV 指令來定義變數值。這些值會保留在構建的映象中。通常,永續性並不是您想要的。使用者希望根據構建映象的主機不同來指定不同的變數。

一個很好的例子是 http_proxy 或用於拉取中間檔案的源版本。ARG 指令允許 Dockerfile 作者定義使用者可以在構建時使用 --build-arg 標誌設定的值

$ docker buildx build --build-arg HTTP_PROXY=http://10.20.30.2:1234 --build-arg FTP_PROXY=http://40.50.60.5:4567 .

此標誌允許您傳遞構建時變數,這些變數在 Dockerfile 的 RUN 指令中像常規環境變數一樣訪問。這些值不像 ENV 值那樣保留在中間或最終映象中。您必須為每個構建引數新增 --build-arg

使用此標誌不會更改構建過程回顯 Dockerfile 中的 ARG 行時您看到的輸出。

有關使用 ARGENV 指令的詳細資訊,請參閱Dockerfile 參考

您還可以不帶值使用 --build-arg 標誌,在這種情況下,守護程式會將本地環境中的值傳播到正在構建的 Docker 容器中

$ export HTTP_PROXY=http://10.20.30.2:1234
$ docker buildx build --build-arg HTTP_PROXY .

此示例類似於 docker run -e 的工作方式。有關更多資訊,請參閱docker run 文件

還有一些有用的內建構建引數,例如

  • BUILDKIT_CONTEXT_KEEP_GIT_DIR=<bool>:觸發 git 上下文以保留 .git 目錄
  • BUILDKIT_INLINE_CACHE=<bool>:是否將快取元資料內聯到映象配置中
  • BUILDKIT_MULTI_PLATFORM=<bool>:選擇確定性輸出,無論是否多平臺輸出
$ docker buildx build --build-arg BUILDKIT_MULTI_PLATFORM=1 .

Dockerfile 參考文件中瞭解更多關於內建構建引數的資訊。

額外的構建上下文(--build-context)

--build-context=name=VALUE

定義帶有指定內容的額外構建上下文。在 Dockerfile 中,當使用 FROM name--from=name 時可以訪問上下文。當 Dockerfile 定義了一個同名階段時,它將被覆蓋。

值可以是

使用本地路徑

暴露輔助本地源目錄

$ docker buildx build --build-context project=path/to/project/source .
# docker buildx build --build-context project=https://github.com/myuser/project.git .

使用容器映象

使用 docker-image:// 方案。

alpine:latest 替換為已固定的映象

$ docker buildx build --build-context alpine=docker-image://alpine@sha256:0123456789 .
# syntax=docker/dockerfile:1
FROM alpine
COPY --from=project myfile /

使用 OCI 佈局目錄作為構建上下文

使用 oci-layout:/// 方案。

從本地 OCI 佈局相容目錄獲取映象,透過標籤或摘要

$ docker buildx build --build-context foo=oci-layout:///path/to/local/layout:<tag>
$ docker buildx build --build-context foo=oci-layout:///path/to/local/layout@sha256:<digest>
# syntax=docker/dockerfile:1
FROM alpine
RUN apk add git
COPY --from=foo myfile /

FROM foo

OCI 佈局目錄必須符合OCI 佈局規範

覆蓋已配置的構建器例項(--builder)

buildx --builder

使用外部快取源進行構建(--cache-from)

--cache-from=[NAME|type=TYPE[,KEY=VALUE]]

使用外部快取源進行構建。支援的型別有

  • registry 可以從登錄檔中的快取清單或(特殊)映象配置匯入快取。
  • local 可以從以前使用 --cache-to 匯出的本地檔案匯入快取。
  • gha 可以從您 GitHub 儲存庫中以前使用 --cache-to 匯出的快取匯入快取。
  • s3 可以從您 S3 儲存桶中以前使用 --cache-to 匯出的快取匯入快取。
  • azblob 可以從您 Azure 儲存桶中以前使用 --cache-to 匯出的快取匯入快取。

如果未指定型別,則使用 registry 匯出器和指定的引用。

$ docker buildx build --cache-from=user/app:cache .
$ docker buildx build --cache-from=user/app .
$ docker buildx build --cache-from=type=registry,ref=user/app .
$ docker buildx build --cache-from=type=local,src=path/to/cache .
$ docker buildx build --cache-from=type=gha .
$ docker buildx build --cache-from=type=s3,region=eu-west-1,bucket=mybucket .
注意

有關快取匯出器和可用屬性的更多資訊,請參閱快取儲存後端文件

將構建快取匯出到外部快取目的地(--cache-to)

--cache-to=[NAME|type=TYPE[,KEY=VALUE]]

將構建快取匯出到外部快取目的地。支援的型別有

  • registry 將構建快取匯出到登錄檔中的快取清單。
  • local 將快取匯出到客戶端上的本地目錄。
  • inline 將快取元資料寫入映象配置。
  • gha 透過 GitHub Actions 快取服務 API 匯出快取。
  • s3 將快取匯出到 S3 儲存桶。
  • azblob 將快取匯出到 Azure 儲存桶。
$ docker buildx build --cache-to=user/app:cache .
$ docker buildx build --cache-to=type=inline .
$ docker buildx build --cache-to=type=registry,ref=user/app .
$ docker buildx build --cache-to=type=local,dest=path/to/cache .
$ docker buildx build --cache-to=type=gha .
$ docker buildx build --cache-to=type=s3,region=eu-west-1,bucket=mybucket .
注意

有關快取匯出器和可用屬性的更多資訊,請參閱快取儲存後端文件

呼叫前端方法(--call)

--call=[build|check|outline|targets]

BuildKit 前端支援構建的替代執行模式,使用前端方法。前端方法是一種改變或擴充套件構建呼叫行為的方式,例如,您可以檢查、驗證或從構建中生成替代輸出。

docker buildx build--call 標誌允許您指定要執行的前端方法。如果未指定此標誌,它預設為執行構建和評估構建檢查

對於 Dockerfile,可用的方法有

命令描述
build(預設)執行構建並評估當前構建目標的構建檢查。
check評估整個 Dockerfile 或所選目標的構建檢查,而不執行構建。
outline顯示您可以為目標設定的構建引數及其預設值。
targets列出 Dockerfile 中的所有構建目標。
subrequests.describe列出當前前端支援的所有前端方法。

請注意,其他前端可能會實現這些或其它方法。要檢視您正在使用的前端的可用方法列表,請使用 --call=subrequests.describe

$ docker buildx build -q --call=subrequests.describe .

NAME                 VERSION DESCRIPTION
outline              1.0.0   List all parameters current build target supports
targets              1.0.0   List all targets current build supports
subrequests.describe 1.0.0   List available subrequest types

描述

--call=targets--call=outline 方法(如果可用)包含構建目標和引數的描述。描述是根據 Dockerfile 中的註釋生成的。FROM 指令之前的行上的註釋成為構建目標的描述,ARG 指令之前的註釋成為構建引數的描述。註釋必須以階段或引數的名稱開頭,例如

# syntax=docker/dockerfile:1

# GO_VERSION sets the Go version for the build
ARG GO_VERSION=1.22

# base-builder is the base stage for building the project
FROM golang:${GO_VERSION} AS base-builder

當您執行 docker buildx build --call=outline 時,輸出包含以下描述

$ docker buildx build -q --call=outline .

TARGET:      base-builder
DESCRIPTION: is the base stage for building the project

BUILD ARG    VALUE   DESCRIPTION
GO_VERSION   1.22    sets the Go version for the build

有關如何編寫 Dockerfile 文件字串的更多示例,請檢視 Docker 文件的 Dockerfile

呼叫:check (--check)

check 方法在不執行構建的情況下評估構建檢查。--check 標誌是 --call=check 的便捷簡寫。使用 check 方法可以在啟動構建之前驗證構建配置。

$ docker buildx build -q --check https://github.com/docker/docs.git

WARNING: InvalidBaseImagePlatform
Base image wjdp/htmltest:v0.17.0 was pulled with platform "linux/amd64", expected "linux/arm64" for current build
Dockerfile:43
--------------------
  41 |         "#content/desktop/previous-versions/*.md"
  42 |
  43 | >>> FROM wjdp/htmltest:v${HTMLTEST_VERSION} AS test
  44 |     WORKDIR /test
  45 |     COPY --from=build /out ./public
--------------------

使用 --check 而不指定目標會評估整個 Dockerfile。如果要評估特定目標,請使用 --target 標誌。

呼叫:outline

outline 方法列印指定目標(如果未指定 --target,則為預設目標)的名稱,以及該目標消耗的構建引數及其預設值(如果已設定)。

以下示例顯示了預設目標 release 及其構建引數

$ docker buildx build -q --call=outline https://github.com/docker/docs.git

TARGET:      release
DESCRIPTION: is an empty scratch image with only compiled assets

BUILD ARG          VALUE     DESCRIPTION
GO_VERSION         1.22      sets the Go version for the base stage
HUGO_VERSION       0.127.0
HUGO_ENV                     sets the hugo.Environment (production, development, preview)
DOCS_URL                     sets the base URL for the site
PAGEFIND_VERSION   1.1.0

這意味著 release 目標可以使用這些構建引數進行配置

$ docker buildx build \
  --build-arg GO_VERSION=1.22 \
  --build-arg HUGO_VERSION=0.127.0 \
  --build-arg HUGO_ENV=production \
  --build-arg DOCS_URL=https://example.com \
  --build-arg PAGEFIND_VERSION=1.1.0 \
  --target release https://github.com/docker/docs.git

呼叫:targets

targets 方法列出 Dockerfile 中的所有構建目標。這些是您可以使用 --target 標誌構建的階段。它還指示預設目標,即當您不指定目標時將構建的目標。

$ docker buildx build -q --call=targets https://github.com/docker/docs.git

TARGET            DESCRIPTION
base              is the base stage with build dependencies
node              installs Node.js dependencies
hugo              downloads and extracts the Hugo binary
build-base        is the base stage for building the site
dev               is for local development with Docker Compose
build             creates production builds with Hugo
lint              lints markdown files
test              validates HTML output and checks for broken links
update-modules    downloads and vendors Hugo modules
vendor            is an empty stage with only vendored Hugo modules
build-upstream    builds an upstream project with a replacement module
validate-upstream validates HTML output for upstream builds
unused-media      checks for unused graphics and other media
pagefind          installs the Pagefind runtime
index             generates a Pagefind index
test-go-redirects checks that the /go/ redirects are valid
release (default) is an empty scratch image with only compiled assets

使用自定義父 cgroup (--cgroup-parent)

當您使用 --cgroup-parent 選項執行 docker buildx build 時,守護程式將使用相應的 docker run 標誌執行構建中使用的容器。

指定 Dockerfile (-f, --file)

$ docker buildx build -f <filepath> .

指定要使用的 Dockerfile 的檔案路徑。如果未指定,預設使用構建上下文根目錄中名為 Dockerfile 的檔案。

要從 stdin 讀取 Dockerfile,可以使用 - 作為 --file 的引數。

$ cat Dockerfile | docker buildx build -f - .

將單平臺構建結果載入到 docker images (--load)

--output=type=docker 的簡寫。將自動將單平臺構建結果載入到 docker images

將構建結果元資料寫入檔案(--metadata-file)

要輸出構建元資料,例如映象摘要,請傳遞 --metadata-file 標誌。元資料將以 JSON 物件的形式寫入指定檔案。指定檔案的目錄必須已存在且可寫。

$ docker buildx build --load --metadata-file metadata.json .
$ cat metadata.json
{
  "buildx.build.provenance": {},
  "buildx.build.ref": "mybuilder/mybuilder0/0fjb6ubs52xx3vygf6fgdl611",
  "buildx.build.warnings": {},
  "containerimage.config.digest": "sha256:2937f66a9722f7f4a2df583de2f8cb97fc9196059a410e7f00072fc918930e66",
  "containerimage.descriptor": {
    "annotations": {
      "config.digest": "sha256:2937f66a9722f7f4a2df583de2f8cb97fc9196059a410e7f00072fc918930e66",
      "org.opencontainers.image.created": "2022-02-08T21:28:03Z"
    },
    "digest": "sha256:19ffeab6f8bc9293ac2c3fdf94ebe28396254c993aea0b5a542cfb02e0883fa3",
    "mediaType": "application/vnd.oci.image.manifest.v1+json",
    "size": 506
  },
  "containerimage.digest": "sha256:19ffeab6f8bc9293ac2c3fdf94ebe28396254c993aea0b5a542cfb02e0883fa3"
}
注意

構建記錄出處buildx.build.provenance)預設包含最小出處。設定 BUILDX_METADATA_PROVENANCE 環境變數以自定義此行為

  • min 設定最小出處(預設)。
  • max 設定完整出處。
  • disabledfalse0 不設定任何出處。
注意

構建警告(buildx.build.warnings)預設不包含。將 BUILDX_METADATA_WARNINGS 環境變數設定為 1true 以包含它們。

設定構建期間 RUN 指令的網路模式(--network)

網路模式的可用選項有

  • default(預設):在預設網路中執行。
  • none:在沒有網路訪問的情況下執行。
  • host:在主機的網路環境中執行。

Dockerfile 參考中查詢更多詳細資訊。

忽略特定階段的構建快取(--no-cache-filter)

--no-cache-filter 允許您指定多階段 Dockerfile 的一個或多個階段,這些階段應忽略構建快取。要指定多個階段,請使用逗號分隔語法

$ docker buildx build --no-cache-filter stage1,stage2,stage3 .

例如,以下 Dockerfile 包含四個階段

  • base
  • install
  • test
  • release
# syntax=docker/dockerfile:1

FROM oven/bun:1 AS base
WORKDIR /app

FROM base AS install
WORKDIR /temp/dev
RUN --mount=type=bind,source=package.json,target=package.json \
    --mount=type=bind,source=bun.lockb,target=bun.lockb \
    bun install --frozen-lockfile

FROM base AS test
COPY --from=install /temp/dev/node_modules node_modules
COPY . .
RUN bun test

FROM base AS release
ENV NODE_ENV=production
COPY --from=install /temp/dev/node_modules node_modules
COPY . .
ENTRYPOINT ["bun", "run", "index.js"]

忽略 install 階段的快取

$ docker buildx build --no-cache-filter install .

忽略 installrelease 階段的快取

$ docker buildx build --no-cache-filter install,release .

--no-cache-filter 標誌的引數必須是階段名稱。

設定構建結果的匯出操作(-o, --output)

-o, --output=[PATH,-,type=TYPE[,KEY=VALUE]

設定構建結果的匯出操作。使用 docker 構建驅動程式時的預設輸出是將容器映象匯出到本地映象儲存。--output 標誌使此步驟可配置,並允許將結果直接匯出到客戶端的檔案系統、OCI 映象 tarball、登錄檔等。

使用 docker 驅動程式的 Buildx 僅支援本地、tarball 和映象匯出器docker-container 驅動程式支援所有匯出器。

如果您只將檔案路徑指定為 --output 的引數,Buildx 會使用本地匯出器。如果值為 -,Buildx 會使用 tar 匯出器並將輸出寫入 stdout。

$ docker buildx build -o . .
$ docker buildx build -o outdir .
$ docker buildx build -o - . > out.tar
$ docker buildx build -o type=docker .
$ docker buildx build -o type=docker,dest=- . > myimage.tar
$ docker buildx build -t tonistiigi/foo -o type=registry

您可以透過重複該標誌來匯出多個輸出。

支援的匯出型別有

local

local 匯出型別將所有結果檔案寫入客戶端上的目錄。新檔案將由當前使用者擁有。在多平臺構建中,所有結果將按其平臺放在子目錄中。

屬性鍵

  • dest - 檔案將寫入的目標目錄

有關更多資訊,請參閱本地和 tar 匯出器

tar

tar 匯出型別將所有結果檔案作為單個 tarball 寫入客戶端。在多平臺構建中,所有結果將按其平臺放在子目錄中。

屬性鍵

  • dest - tarball 將寫入的目標路徑。“-”寫入標準輸出。

有關更多資訊,請參閱本地和 tar 匯出器

oci

oci 匯出型別將結果映象或清單列表作為 OCI 映象佈局 tarball 寫入客戶端。

屬性鍵

  • dest - tarball 將寫入的目標路徑。“-”寫入標準輸出。

有關更多資訊,請參閱OCI 和 Docker 匯出器

docker

docker 匯出型別將單平臺結果映象作為 Docker 映象規範 tarball 寫入客戶端。此匯出器建立的 tarball 也相容 OCI。

Docker Engine 中的預設映象儲存不支援載入多平臺映象。您可以啟用 containerd 映象儲存,或者將多平臺映象直接推送到登錄檔,請參閱registry

屬性鍵

  • dest - tarball 將寫入的目標路徑。如果未指定,tar 將自動載入到本地映象儲存中。
  • context - 匯入結果的 Docker 上下文名稱

有關更多資訊,請參閱OCI 和 Docker 匯出器

image

image 匯出器將構建結果作為映象或清單列表寫入。當使用 docker 驅動程式時,映象將顯示在 docker images 中。可選地,透過指定屬性,映象可以自動推送到登錄檔。

屬性鍵

  • name - 新映象的名稱(引用)。
  • push - 布林值,用於自動推送映象。

有關更多資訊,請參閱映象和登錄檔匯出器

registry

registry 匯出器是 type=image,push=true 的快捷方式。

有關更多資訊,請參閱映象和登錄檔匯出器

設定構建的目標平臺(--platform)

--platform=value[,value]

設定構建的目標平臺。Dockerfile 中所有沒有自己 --platform 標誌的 FROM 命令都將為此平臺拉取基礎映象,並且此值也將是生成映象的平臺。

預設值是構建執行的 BuildKit 守護程式的平臺。該值採用 os/archos/arch/variant 的形式。例如,linux/amd64linux/arm/v7。此外,--platform 標誌還支援特殊的 local 值,它告訴 BuildKit 使用呼叫構建的 BuildKit 客戶端的平臺。

當使用 buildxdocker-container 驅動程式時,此標誌可以接受多個值作為逗號分隔的輸入。對於多個值,結果將為所有指定平臺構建併合併到單個清單列表中。

如果 Dockerfile 需要呼叫 RUN 命令,構建器需要對指定平臺提供執行時支援。在乾淨的設定中,您只能執行系統架構的 RUN 命令。如果您的核心支援用於輔助架構的 binfmt_misc 啟動器,buildx 將自動獲取它們。Docker Desktop 版本自動配置了 arm64arm 架構的 binfmt_misc。您可以透過執行 docker buildx inspect --bootstrap 來檢視當前構建器例項支援哪些執行時平臺。

Dockerfile 內部,您可以透過 TARGETPLATFORM 構建引數訪問當前平臺值。有關自動平臺引數變體的完整描述,請參閱Dockerfile 參考

您可以在 containerd 原始碼中找到平臺指定符的格式定義。

$ docker buildx build --platform=linux/arm64 .
$ docker buildx build --platform=linux/amd64,linux/arm64,linux/arm/v7 .
$ docker buildx build --platform=darwin .

設定進度輸出型別(--progress)

--progress=VALUE

設定進度輸出型別。支援的值有

  • auto(預設):如果客戶端是 TTY,則使用 tty 模式;否則使用 plain 模式
  • tty:帶有顏色和重繪的互動式輸出流
  • plain:以純文字格式列印原始構建進度
  • quiet:抑制構建輸出並在成功時列印映象 ID(與 --quiet 相同)
  • rawjson:以 JSON 行的形式列印原始構建進度
注意

您還可以使用 BUILDKIT_PROGRESS 環境變數來設定其值。

以下示例在構建期間使用 plain 輸出

$ docker buildx build --load --progress=plain .

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 227B 0.0s done
#1 DONE 0.1s

#2 [internal] load .dockerignore
#2 transferring context: 129B 0.0s done
#2 DONE 0.0s
...
注意

另請檢視BUILDKIT_COLORS 環境變數,瞭解如何修改終端輸出的顏色。

rawjson 輸出將 BuildKit 的解決狀態事件轉換為 JSON 行。此模式旨在由外部程式讀取。

創建出處證明(--provenance)

--attest=type=provenance 的簡寫,用於配置構建結果的出處證明。例如,--provenance=mode=max 可以用作 --attest=type=provenance,mode=max 的縮寫。

此外,--provenance 可以與布林值一起使用,以啟用或禁用出處證明。例如,--provenance=false 停用所有出處證明,而 --provenance=true 啟用所有出處證明。

預設情況下,將為構建結果建立一個最小的出處證明。請注意,Docker Engine 中的預設映象儲存不支援證明。如果使用預設映象儲存,出處證明僅對直接推送到登錄檔的映象持久化。或者,您可以切換到使用 containerd 映象儲存。

有關出處證明的更多資訊,請參閱此處

將構建結果推送到登錄檔(--push)

--output=type=registry 的簡寫。將自動將構建結果推送到登錄檔。

建立 SBOM 證明(--sbom)

--attest=type=sbom 的簡寫,用於配置構建結果的 SBOM 證明。例如,--sbom=generator=<user>/<generator-image> 可以用作 --attest=type=sbom,generator=<user>/<generator-image> 的縮寫。

此外,--sbom 可以與布林值一起使用,以啟用或停用 SBOM 證明。例如,--sbom=false 停用所有 SBOM 證明。

請注意,Docker Engine 中的預設映象儲存不支援證明。出處證明僅對直接推送到登錄檔的映象持久化,如果您使用預設映象儲存。或者,您可以切換到使用 containerd 映象儲存。

有關更多資訊,請參閱此處

暴露給構建的秘密(--secret)

--secret=[type=TYPE[,KEY=VALUE]

將秘密(身份驗證憑據、令牌)暴露給構建。秘密可以使用 Dockerfile 中 RUN --mount=type=secret 掛載掛載到構建中。有關如何使用構建秘密的更多資訊,請參閱構建秘密

支援的型別有

如果未設定 type,Buildx 會嘗試自動檢測 type。如果設定了與 id 相同的鍵的環境變數,則 Buildx 使用 type=env 並且變數值成為秘密。如果未設定此類環境變數,並且未設定 type,則 Buildx 回退到 type=file

type=file

從檔案中獲取構建秘密。

type=file 概要
$ docker buildx build --secret [type=file,]id=<ID>[,src=<FILEPATH>] .
type=file 屬性
金鑰描述預設值
id秘密的 ID。不適用(此鍵是必需的)
srcsource包含秘密值的檔案路徑(絕對路徑或相對於當前工作目錄)。如果未設定,則為 id
type=file 用法

在以下示例中,由於沒有設定與 aws(ID)匹配的環境變數,因此自動檢測到 type=file

$ docker buildx build --secret id=aws,src=$HOME/.aws/credentials .
# syntax=docker/dockerfile:1
FROM python:3
RUN pip install awscli
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
  aws s3 cp s3://... ...

type=env

從環境變數中獲取構建秘密。

type=env 概要
$ docker buildx build --secret [type=env,]id=<ID>[,env=<VARIABLE>] .
type=env 屬性
金鑰描述預設值
id秘密的 ID。不適用(此鍵是必需的)
envsrcsource獲取秘密的環境變數。如果未設定,則為 id
type=env 用法

在以下示例中,由於設定了與 id 匹配的環境變數,因此自動檢測到 type=env

$ SECRET_TOKEN=token docker buildx build --secret id=SECRET_TOKEN .
# syntax=docker/dockerfile:1
FROM node:alpine
RUN --mount=type=bind,target=. \
  --mount=type=secret,id=SECRET_TOKEN,env=SECRET_TOKEN \
  yarn run test

在以下示例中,構建引數 SECRET_TOKEN 設定為包含環境變數 API_KEY 的值。

$ API_KEY=token docker buildx build --secret id=SECRET_TOKEN,env=API_KEY .

您還可以使用 srcsource 指定環境變數的名稱

$ API_KEY=token docker buildx build --secret type=env,id=SECRET_TOKEN,src=API_KEY .
注意

使用 srcsource 指定環境變數名稱時,您需要顯式設定 type=env,否則 Buildx 會假定秘密是 type=file,並查詢名為 srcsource 的檔案(在此示例中,是相對於執行 docker buildx build 命令的位置的名為 API_KEY 的檔案)。

構建容器的共享記憶體大小(--shm-size)

設定使用 RUN 指令時為構建容器分配的共享記憶體大小。

格式為 <number><unit>number 必須大於 0。單位是可選的,可以是 b(位元組)、k(千位元組)、m(兆位元組)或 g(千兆位元組)。如果您省略單位,系統將使用位元組。

注意

在大多數情況下,建議讓構建器自動確定適當的配置。只有當複雜構建場景需要特定的效能調優時,才應考慮手動調整。

暴露給構建的 SSH 代理套接字或金鑰(--ssh)

--ssh=default|<id>[=<socket>|<key>[,<key>]]

當 Dockerfile 中的某些命令需要特定的 SSH 身份驗證(例如,克隆私有倉庫)時,這可能很有用。

--ssh 將 SSH 代理套接字或金鑰暴露給構建,可與 RUN --mount=type=ssh 掛載一起使用。

使用 SSH 代理套接字訪問 Gitlab 的示例

# syntax=docker/dockerfile:1
FROM alpine
RUN apk add --no-cache openssh-client
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
RUN --mount=type=ssh ssh -q -T git@gitlab.com 2>&1 | tee /hello
# "Welcome to GitLab, @GITLAB_USERNAME_ASSOCIATED_WITH_SSHKEY" should be printed here
# with the type of build progress is defined as `plain`.
$ eval $(ssh-agent)
$ ssh-add ~/.ssh/id_rsa
(Input your passphrase here)
$ docker buildx build --ssh default=$SSH_AUTH_SOCK .

標記映象(-t, --tag)

$ docker buildx build -t docker/apache:2.0 .

此示例以與上一個示例相同的方式構建,但它隨後會標記生成的映象。倉庫名稱將為 docker/apache,標籤為 2.0

閱讀有關有效標籤的更多資訊.

您可以為一個映象應用多個標籤。例如,您可以為新構建的映象應用 latest 標籤,並新增另一個引用特定版本的標籤。

例如,要將映象同時標記為 docker/fedora-jboss:latestdocker/fedora-jboss:v2.1,請使用以下命令

$ docker buildx build -t docker/fedora-jboss:latest -t docker/fedora-jboss:v2.1 .

指定目標構建階段(--target)

當構建包含多個構建階段的 Dockerfile 時,使用 --target 選項指定一箇中間構建階段的名稱作為結果映象的最終階段。構建器會跳過目標階段之後的命令。

FROM debian AS build-env
# ...

FROM alpine AS production-env
# ...
$ docker buildx build -t mybuildimage --target build-env .

設定 ulimits (--ulimit)

--ulimit 覆蓋構建容器使用 RUN 指令時的預設 ulimits,並指定軟限制和硬限制,例如:<type>=<soft limit>[:<hard limit>],例如

$ docker buildx build --ulimit nofile=1024:1024 .
注意

如果您不提供 hard limit,則 soft limit 將用於這兩個值。如果未設定 ulimits,它們將繼承自守護程式上設定的預設 ulimits

注意

在大多數情況下,建議讓構建器自動確定適當的配置。只有當複雜構建場景需要特定的效能調優時,才應考慮手動調整。