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設定評估構建的方法(check, outline, targets
--cgroup-parent設定構建期間 RUN 指令的父 cgroup
--check--call=check 的簡寫
--detach實驗性 (CLI) 分離 buildx 伺服器(僅在 linux 上支援)
-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設定進度輸出型別(auto, quiet, plain, tty, rawjson)。使用 plain 顯示容器輸出
--provenance--attest=type=provenance 的簡寫
--pull始終嘗試拉取所有引用的映象
--push--output=type=registry 的簡寫
-q, --quiet抑制構建輸出並在成功時列印映象 ID
--root實驗性 (CLI) 指定要連線的伺服器根目錄
--sbom--attest=type=sbom 的簡寫
--secret暴露給構建的 Secret(格式:id=mysecret[,src=/local/secret]
--server-config實驗性 (CLI) 指定 buildx 伺服器配置檔案(僅在啟動新伺服器時使用)
--shm-size構建容器的共享記憶體大小
--ssh暴露給構建的 SSH 代理 socket 或金鑰(格式:default|<id>[=<socket>|<key>[,<key>]]
-t, --tag名稱和可選的標籤(格式:name:tag
--target設定要構建的目標構建階段
--ulimitUlimit 選項

示例

向容器的 hosts 檔案新增條目 (--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 的清單添加註解。

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

建立證明 (--attest)

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

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

  • sbom - 軟體物料清單。

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

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

  • provenance - SLSA 來源證明

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

    預設情況下,將為構建結果建立一個最小的來源證明,該證明僅附加到推送至倉庫的映象。

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

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

--allow=ENTITLEMENT

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

為了啟用這些授權,BuildKit daemon 也需要使用 --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 標誌,在這種情況下,daemon 會將本地環境中的值傳播到它正在構建的 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 定義了同名階段,則該階段會被覆蓋。

該值可以是本地源目錄、符合本地 OCI 佈局規範的目錄、容器映象(帶有 docker-image:// 字首)、Git 或 HTTP URL。

用固定的映象替換 alpine:latest

$ docker buildx build --build-context alpine=docker-image://alpine@sha256:0123456789 .

暴露第二個本地源目錄

$ docker buildx build --build-context project=path/to/project/source .
# docker buildx build --build-context project=https://github.com/myuser/project.git .
# syntax=docker/dockerfile:1
FROM alpine
COPY --from=project myfile /

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

從本地符合 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]]

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

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

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

docker 驅動程式目前僅支援從倉庫匯入構建快取。

$ 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 .

有關快取匯出器和可用屬性的更多資訊:https://github.com/moby/buildkit#export-cache

呼叫前端方法 (--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 docstrings 的更多示例,請檢視 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

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

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

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

docker 驅動程式僅支援使用 inlinelocal 快取後端匯出快取。

屬性鍵

  • mode - 指定隨快取匯出的層數。min 僅匯出最終構建階段中已有的層,max 匯出所有階段的層。元資料始終匯出整個構建的。
$ 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 .

有關快取匯出器和可用屬性的更多資訊:https://github.com/moby/buildkit#export-cache

使用自定義父 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、registry 等。

Buildx 使用 docker 驅動程式時僅支援 local、tarball 和 image 匯出器docker-container 驅動程式支援所有匯出器。

如果您僅指定檔案路徑作為 --output 的引數,Buildx 將使用 local 匯出器。如果值為 -,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 - 檔案將被寫入的目標目錄

更多資訊,請參見 Local 和 tar 匯出器

tar

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

屬性鍵

  • dest - tarball 將被寫入的目標路徑。“-” 寫入 stdout。

更多資訊,請參見 Local 和 tar 匯出器

oci

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

屬性鍵

  • dest - tarball 將被寫入的目標路徑。“-” 寫入 stdout。

更多資訊,請參見 OCI 和 Docker 匯出器

docker

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

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

屬性鍵

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

更多資訊,請參見 OCI 和 Docker 匯出器

image

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

屬性鍵

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

更多資訊,請參見 Image 和 registry 匯出器

registry

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

更多資訊,請參見 Image 和 registry 匯出器

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

--platform=value[,value]

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

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

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

如果 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 中的預設映象儲存不支援證明。如果您使用預設映象儲存,來源證明僅對直接推送到 registry 的映象持久化。或者,您可以切換到使用 containerd 映象儲存。

有關來源證明的更多資訊,請參見此處

將構建結果推送到 registry (--push)

--output=type=registry 的簡寫形式。將自動將構建結果推送到 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 中的預設映象儲存不支援證明。如果您使用預設映象儲存,來源證明僅對直接推送到 registry 的映象持久化。或者,您可以切換到使用 containerd 映象儲存。

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

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

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

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

支援的型別有

如果未設定 type,Buildx 會嘗試自動檢測。如果設定了與 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。N/A(此鍵必需)
src, source包含秘密值的檔案路徑(絕對路徑或相對於當前工作目錄的路徑)。如果未設定,則為 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。N/A(此鍵必需)
env, src, source用作秘密來源的環境變數。如果未設定,則為 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 agent socket 或金鑰 (--ssh)

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

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

--ssh 將 SSH agent socket 或金鑰暴露給構建,並可以與 RUN --mount=type=ssh 掛載一起使用。

使用 SSH agent socket 訪問 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

注意

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