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.host ,security.insecure ) | |
--annotation | 為映象添加註解 | |
--attest | 證明引數(格式:type=sbom,generator=image ) | |
--build-arg | 設定構建時變數 | |
--build-context | 附加構建上下文(例如,name=path) | |
--cache-from | 外部快取源(例如,user/app:cache ,type=local,src=path/to/dir ) | |
--cache-to | 快取匯出目標(例如,user/app:cache ,type=local,dest=path/to/dir ) | |
--call | build | 設定評估構建的方法(check , outline , targets ) |
--cgroup-parent | 設定構建期間 RUN 指令的父 cgroup | |
--check | --call=check 的簡寫 | |
--detach | 實驗性 (CLI) 分離 buildx 伺服器(僅在 linux 上支援) | |
-f, --file | Dockerfile 的名稱(預設值: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 | 設定構建的目標平臺 | |
--progress | auto | 設定進度輸出型別(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 | 設定要構建的目標構建階段 | |
--ulimit | Ulimit 選項 |
示例
向容器的 hosts 檔案新增條目 (--add-host)
您可以使用一個或多個 --add-host
標誌將其他主機新增到構建容器的 /etc/hosts
檔案中。此示例為名為 my-hostname
和 my_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
允許額外的特權授權。授權列表:
network.host
- 允許使用主機網路執行。security.insecure
- 允許在沒有沙箱的情況下執行。請參閱相關的 Dockerfile 擴充套件。
為了啟用這些授權,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
行時您看到的輸出。
有關使用 ARG
和 ENV
指令的詳細資訊,請參閱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]]
為構建使用外部快取源。支援的型別有 registry
、local
、gha
和 s3
。
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]]
將構建快取匯出到外部快取目的地。支援的型別有 registry
、local
、inline
、gha
和 s3
。
registry
型別 將構建快取匯出到 registry 中的快取清單。local
型別 將快取匯出到客戶端上的本地目錄。inline
型別 將快取元資料寫入映象配置中。gha
型別 透過 GitHub Actions Cache service API 匯出快取。s3
型別 將快取匯出到 S3 儲存桶。
docker
驅動程式僅支援使用 inline
和 local
快取後端匯出快取。
屬性鍵
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
設定完整來源證明。disabled
、false
或0
不設定任何來源證明。
注意
構建警告 (
buildx.build.warnings
) 預設不包含。設定BUILDX_METADATA_WARNINGS
環境變數為1
或true
可包含它們。
構建期間為 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 .
要忽略 install
和 release
階段的快取
$ 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/arch
或 os/arch/variant
的形式。例如,linux/amd64
或 linux/arm/v7
。此外,--platform
標誌還支援一個特殊的 local
值,該值告訴 BuildKit 使用呼叫構建的 BuildKit 客戶端的平臺。
將 docker-container
驅動程式與 buildx
一起使用時,此標誌可以接受逗號分隔的多個值作為輸入。使用多個值時,將為所有指定的平臺構建結果,並將其合併到一個清單列表中。
如果 Dockerfile
需要呼叫 RUN
命令,構建器需要對指定平臺提供執行時支援。在乾淨的設定中,您只能執行針對您系統架構的 RUN
命令。如果您的核心支援用於二級架構的 binfmt_misc
啟動器,buildx 將自動識別它們。Docker Desktop 版本自動配置了適用於 arm64
和 arm
架構的 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 .
您也可以使用 src
或 source
指定環境變數的名稱
$ API_KEY=token docker buildx build --secret type=env,id=SECRET_TOKEN,src=API_KEY .
注意
使用
src
或source
指定環境變數名稱時,您需要顯式設定type=env
,否則 Buildx 會假定秘密是type=file
,並查詢名稱為src
或source
的檔案(在本例中,是相對於執行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:latest
和 docker/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
。
注意
在大多數情況下,建議讓構建器自動確定適當的配置。僅當複雜的構建場景需要特定的效能調優時,才應考慮手動調整。