构建变量

在 Docker 构建中,构建参数(ARG)和环境变量(ENV) 都作为将信息传递到构建过程中的手段。 您可以使用它们来参数化构建,从而实现更灵活和可配置的构建。

警告

构建参数和环境变量不适合用于向构建传递机密,因为它们会暴露在最终镜像中。相反,使用机密挂载或SSH挂载,它们可以安全地向构建暴露机密。

查看构建密钥以获取更多信息。

相似与差异

构建参数和环境变量类似。 它们都在 Dockerfile 中声明,并可以使用 docker build 命令的标志进行设置。 两者都可以用于参数化构建。 但它们各自有不同的用途。

构建参数

构建参数是 Dockerfile 本身的变量。 使用它们来参数化 Dockerfile 指令的值。 例如,您可以使用构建参数来指定要安装的依赖项的版本。

构建参数除非在指令中使用,否则对构建没有影响。 除非从 Dockerfile 明确传递到镜像文件系统或配置中,否则在从镜像实例化的容器中不可访问或不存在。 它们可能会以来源证明和镜像历史的形式保留在镜像元数据中, 这就是为什么它们不适合用于存储机密的原因。

它们使Dockerfile更具灵活性,也更易于维护。

有关如何使用构建参数的示例,请参阅 ARG 使用示例

环境变量

环境变量会传递到构建执行环境中,并在从该镜像实例化的容器中持续存在。

环境变量主要用于:

  • 配置构建的执行环境
  • 为容器设置默认环境变量

环境变量(如果已设置)可以直接影响构建的执行,以及应用程序的行为或配置。

你不能在构建时覆盖或设置环境变量。 环境变量的值必须在Dockerfile中声明。 你可以将环境变量和构建参数结合起来,以允许在构建时配置环境变量。

有关如何使用环境变量配置构建的示例,请参阅 ENV 使用示例

ARG 使用示例

构建参数通常用于指定构建中使用的组件版本, 例如镜像变体或软件包版本。

将版本指定为构建参数,可以在不手动更新Dockerfile的情况下使用不同版本进行构建。 它还使维护Dockerfile变得更加容易, 因为可以在文件顶部声明版本。

构建参数也可以是一种在多个地方重用值的方法。 例如,如果你在构建中使用了多个版本的 alpine, 你可以确保在所有地方都使用相同的 alpine 版本:

  • golang:1.22-alpine${ALPINE_VERSION}
  • python:3.12-alpine${ALPINE_VERSION}
  • nginx:1-alpine${ALPINE_VERSION}

以下示例使用构建参数定义版本 nodealpine

# syntax=docker/dockerfile:1

ARG NODE_VERSION="20"
ARG ALPINE_VERSION="3.21"

FROM node:${NODE_VERSION}-alpine${ALPINE_VERSION} AS base
WORKDIR /src

FROM base AS build
COPY package*.json ./
RUN npm ci
RUN npm run build

FROM base AS production
COPY package*.json ./
RUN npm ci --omit=dev && npm cache clean --force
COPY --from=build /src/dist/ .
CMD ["node", "app.js"]

在这种情况下,构建参数具有默认值。 在调用构建时指定它们的值是可选的。 要覆盖默认值,您将使用 --build-arg CLI 标志:

$ docker build --build-arg NODE_VERSION=current .

有关如何使用构建参数的更多信息,请参阅:

ENV 使用示例

在构建阶段中使用 ENV 声明环境变量,会使该变量对后续的所有指令可用。 以下示例展示了在使用 npm 安装 JavaScript 依赖之前,将 NODE_ENV 设置为 production 的过程。 设置该变量后,npm 将忽略仅用于本地开发所需的包。

# syntax=docker/dockerfile:1

FROM node:20
WORKDIR /app
COPY package*.json ./
ENV NODE_ENV=production
RUN npm ci && npm cache clean --force
COPY . .
CMD ["node", "app.js"]

构建时默认无法配置环境变量。 如果要在构建时更改 ENV 的值, 可以将环境变量与构建参数结合使用:

# syntax=docker/dockerfile:1

FROM node:20
ARG NODE_ENV=production
ENV NODE_ENV=$NODE_ENV
WORKDIR /app
COPY package*.json ./
RUN npm ci && npm cache clean --force
COPY . .
CMD ["node", "app.js"]

使用此 Dockerfile,您可以使用 --build-arg 覆盖 ENV 的默认值:

$ docker build --build-arg NODE_ENV=development .

请注意,由于您设置的环境变量会保留在容器中, 使用它们可能会导致应用程序运行时出现意外的副作用。

有关如何在构建中使用环境变量的更多信息,请参阅:

作用域

在 Dockerfile 的全局范围内声明的构建参数不会自动继承到构建阶段。它们仅在全局范围内可访问。

# syntax=docker/dockerfile:1

# The following build argument is declared in the global scope:
ARG NAME="joe"

FROM alpine
# The following instruction doesn't have access to the $NAME build argument
# because the argument was defined in the global scope, not for this stage.
RUN echo "hello ${NAME}!"

在本示例中,此 echo 命令的计算结果为 hello ! 因为 NAME 构建参数的值已超出范围。 若要在阶段中继承全局构建参数,必须使用它们:

# syntax=docker/dockerfile:1

# Declare the build argument in the global scope
ARG NAME="joe"

FROM alpine
# Consume the build argument in the build stage
ARG NAME
RUN echo $NAME

一旦在阶段中声明或使用了构建参数, 它将自动被子阶段继承。

# syntax=docker/dockerfile:1
FROM alpine AS base
# Declare the build argument in the build stage
ARG NAME="joe"

# Create a new stage based on "base"
FROM base AS build
# The NAME build argument is available here
# since it's declared in a parent stage
RUN echo "hello $NAME!"

以下图表进一步说明了多阶段构建中构建参数和环境变量继承的工作原理。

预定义构建参数

本节描述所有构建默认可用的预定义构建参数。

多平台构建参数

多平台构建参数描述了构建和目标平台的构建情况。

构建平台是构建器(BuildKit 守护程序)运行的主机系统的操作系统、架构和平台变体。

  • BUILDPLATFORM
  • BUILDOS
  • BUILDARCH
  • BUILDVARIANT

目标平台参数保存了构建的目标平台的相同值, 使用 --platform 标志为 docker build 命令指定。

  • TARGETPLATFORM
  • TARGETOS
  • TARGETARCH
  • TARGETVARIANT

这些参数在多平台构建中进行交叉编译时很有用。 它们在 Dockerfile 的全局范围内可用, 但不会被构建阶段自动继承。 要在阶段内部使用它们,您必须声明它们:

# syntax=docker/dockerfile:1

# Pre-defined build arguments are available in the global scope
FROM --platform=$BUILDPLATFORM golang
# To inherit them to a stage, declare them with ARG
ARG TARGETOS
RUN GOOS=$TARGETOS go build -o ./exe .

有关多平台构建参数的更多信息,请参阅 多平台参数

代理参数

代理构建参数允许您为构建指定要使用的代理。 您无需在 Dockerfile 中声明或引用这些参数。 使用 --build-arg 指定代理就足以使您的构建使用该代理。

代理参数默认会自动从构建缓存和 docker history 的输出中排除。 如果您在 Dockerfile 中引用了这些参数, 代理配置最终会进入构建缓存。

构建器遵循以下代理构建参数。 变量不区分大小写。

  • HTTP_PROXY
  • HTTPS_PROXY
  • FTP_PROXY
  • NO_PROXY
  • ALL_PROXY

要为您的构建配置代理:

$ docker build --build-arg HTTP_PROXY=https://my-proxy.example.com .

有关代理构建参数的更多信息,请参阅 代理参数

构建工具配置变量

以下环境变量用于启用、禁用或更改 Buildx 和 BuildKit 的行为。 请注意,这些变量不用于配置构建容器; 它们在构建内部不可用,与 ENV 指令无关。 它们用于配置 Buildx 客户端或 BuildKit 守护程序。

变量类型描述
BUILDKIT_COLORSstring配置终端输出的文本颜色。
BUILDKIT_HOSTstring指定用于远程构建器的主机。
BUILDKIT_PROGRESSstring配置进度输出的类型。
BUILDKIT_TTY_LOG_LINESstring日志行数(TTY模式下活动步骤)。
BUILDX_BAKE_GIT_AUTH_HEADERstring用于远程 Bake 文件的 HTTP 身份验证方案。
BUILDX_BAKE_GIT_AUTH_TOKENstring用于远程 Bake 文件的 HTTP 身份验证令牌。
BUILDX_BAKE_GIT_SSHstringSSH 身份验证用于远程 Bake 文件。
BUILDX_BUILDERstring指定要使用的构建器实例。
BUILDX_CONFIGstring指定配置、状态和日志的位置。
BUILDX_CPU_PROFILEstring在指定位置生成 pprof CPU 分析文件。
BUILDX_EXPERIMENTAL布尔值打开实验性功能。
BUILDX_GIT_CHECK_DIRTY布尔值启用脏的 Git 检查检测。
BUILDX_GIT_INFO布尔值在 provenance 证明中移除 Git 信息。
BUILDX_GIT_LABELS字符串 | 布尔值向镜像添加 Git 可追溯性标签。
BUILDX_MEM_PROFILEstring在指定位置生成 pprof 内存配置文件。
BUILDX_NO_DEFAULT_ATTESTATIONS布尔值关闭默认的出处证明。
BUILDX_NO_DEFAULT_LOAD布尔值默认情况下关闭将镜像加载到镜像存储。
EXPERIMENTAL_BUILDKIT_SOURCE_POLICYstring指定一个 BuildKit 源策略文件。

BuildKit 还支持一些额外的配置参数。请参阅 BuildKit 内置构建参数

您可以使用不同的方式表示环境变量的布尔值。 例如,true1T 都会计算为真。 计算是使用 Go 标准库中的 strconv.ParseBool 函数进行的。 详情请参阅 参考文档

BUILDKIT_COLORS

更改终端输出的颜色。将 BUILDKIT_COLORS 设置为以下格式的 CSV 字符串:

$ export BUILDKIT_COLORS="run=123,20,245:error=yellow:cancel=blue:warning=white"

颜色值可以是任何有效的 RGB 十六进制代码,或以下之一 BuildKit 预定义颜色

将任何内容设置为NO_COLOR将关闭彩色输出,如no-color.org所建议的那样。

BUILDKIT_HOST

你使用 BUILDKIT_HOST 来指定要使用的 BuildKit 守护程序的地址 作为远程构建器。这与将地址指定为位置参数相同 到 docker buildx create

用法:

$ export BUILDKIT_HOST=tcp://localhost:1234
$ docker buildx create --name=remote --driver=remote

如果你同时指定了BUILDKIT_HOST环境变量和位置参数,参数将具有优先级。

BUILDKIT_PROGRESS

设置 BuildKit 进度输出的类型。有效值为:

  • auto (默认)
  • plain
  • tty
  • rawjson

用法:

$ export BUILDKIT_PROGRESS=plain

BUILDKIT_TTY_LOG_LINES

您可以通过将BUILDKIT_TTY_LOG_LINES设置为数字(默认为6)来更改TTY模式下活动步骤可见的日志行数。

$ export BUILDKIT_TTY_LOG_LINES=8

EXPERIMENTAL_BUILDKIT_SOURCE_POLICY

允许您指定一个 构建源策略文件 以使用固定的依赖项创建可重现的构建。

$ export EXPERIMENTAL_BUILDKIT_SOURCE_POLICY=./policy.json

示例:

{
  "rules": [
    {
      "action": "CONVERT",
      "selector": {
        "identifier": "docker-image://docker.io/library/alpine:latest"
      },
      "updates": {
        "identifier": "docker-image://docker.io/library/alpine:latest@sha256:4edbd2beb5f78b1014028f4fbb99f3237d9561100b6881aabbf5acce2c4f9454"
      }
    },
    {
      "action": "CONVERT",
      "selector": {
        "identifier": "https://raw.githubusercontent.com/moby/buildkit/v0.10.1/README.md"
      },
      "updates": {
        "attrs": {"http.checksum": "sha256:6e4b94fc270e708e1068be28bd3551dc6917a4fc5a61293d51bb36e6b75c4b53"}
      }
    },
    {
      "action": "DENY",
      "selector": {
        "identifier": "docker-image://docker.io/library/golang*"
      }
    }
  ]
}

BUILDX_BAKE_GIT_AUTH_HEADER

在 Buildx 版本中引入 0.14.0

设置在私有 Git 仓库中使用远程 Bake 定义时的 HTTP 身份验证方案。 这相当于 GIT_AUTH_HEADER secret, 但在加载远程 Bake 文件时,便于 Bake 进行预飞行身份验证。 支持的值为 bearer(默认)和 basic

用法:

$ export BUILDX_BAKE_GIT_AUTH_HEADER=basic

BUILDX_BAKE_GIT_AUTH_TOKEN

在 Buildx 版本中引入 0.14.0

在使用私有 Git 仓库中的远程 Bake 定义时,设置 HTTP 身份验证令牌。 这相当于 GIT_AUTH_TOKEN secret, 但在加载远程 Bake 文件时,便于 Bake 进行预飞行身份验证。

用法:

$ export BUILDX_BAKE_GIT_AUTH_TOKEN=$(cat git-token.txt)

BUILDX_BAKE_GIT_SSH

在 Buildx 版本中引入 0.14.0

允许您指定要转发到 Bake 的 SSH 代理套接字文件路径列表,以便在使用私有仓库中的远程 Bake 定义时对 Git 服务器进行身份验证。 这与构建的 SSH 挂载类似,但在解析构建定义时,使 Bake 能够进行预飞行身份验证。

设置此环境通常不是必需的,因为 Bake 默认会使用 SSH_AUTH_SOCK 代理套接字。 只有在您想要使用具有不同文件路径的套接字时,才需要指定此变量。 此变量可以使用逗号分隔的字符串接受多个路径。

用法:

$ export BUILDX_BAKE_GIT_SSH=/run/foo/listener.sock,~/.creds/ssh.sock

BUILDX_BUILDER

覆盖已配置的构建器实例。与 CLI 标志 docker buildx --builder 相同。

用法:

$ export BUILDX_BUILDER=my-builder

BUILDX_CONFIG

您可以使用 BUILDX_CONFIG 来指定用于构建配置、状态和日志的目录。此目录的查找顺序如下:

  • $BUILDX_CONFIG
  • $DOCKER_CONFIG/buildx
  • ~/.docker/buildx (默认)

用法:

$ export BUILDX_CONFIG=/usr/local/etc

BUILDX_CPU_PROFILE

在 Buildx 版本中引入 0.18.0

如果指定,Buildx 会在指定位置生成 pprof CPU 分析文件。

注意

此属性仅在开发 Buildx 时有用。分析构建性能时,此分析数据并不相关。

用法:

$ export BUILDX_CPU_PROFILE=buildx_cpu.prof

BUILDX_EXPERIMENTAL

启用实验性构建功能。

用法:

$ export BUILDX_EXPERIMENTAL=1

BUILDX_GIT_CHECK_DIRTY

在 Buildx 版本中引入 0.10.4

当设置为 true 时,会检查源代码控制信息中的脏状态,以获取 出处证明

用法:

$ export BUILDX_GIT_CHECK_DIRTY=1

BUILDX_GIT_INFO

在 Buildx 版本中引入 0.10.0

当设置为 false 时,将从 来源证明 中移除源代码控制信息。

用法:

$ export BUILDX_GIT_INFO=0

BUILDX_GIT_LABELS

在 Buildx 版本中引入 0.10.0

根据 Git 信息为构建的镜像添加出处标签。标签包括:

  • com.docker.image.source.entrypoint: Dockerfile相对于项目根目录的位置
  • org.opencontainers.image.revision: Git 提交修订版
  • org.opencontainers.image.source: 代码仓库的SSH或HTTPS地址

示例:

  "Labels": {
    "com.docker.image.source.entrypoint": "Dockerfile",
    "org.opencontainers.image.revision": "5734329c6af43c2ae295010778cd308866b95d9b",
    "org.opencontainers.image.source": "git@github.com:foo/bar.git"
  }

用法:

  • BUILDX_GIT_LABELS=1 设置为包含 entrypointrevision 标签。
  • BUILDX_GIT_LABELS=full 设置为包含所有标签。

如果仓库处于脏状态,revision 会加上 -dirty 的后缀。

BUILDX_MEM_PROFILE

在 Buildx 版本中引入 0.18.0

如果指定,Buildx 会在指定位置生成 pprof 内存配置文件。

注意

此属性仅在开发 Buildx 时有用。分析构建性能时,此分析数据并不相关。

用法:

$ export BUILDX_MEM_PROFILE=buildx_mem.prof

BUILDX_NO_DEFAULT_ATTESTATIONS

在 Buildx 版本中引入 0.10.4

默认情况下,BuildKit v0.11 及更高版本会向您构建的镜像中添加 来源证明声明。设置 BUILDX_NO_DEFAULT_ATTESTATIONS=1 以禁用默认的来源证明声明。

用法:

$ export BUILDX_NO_DEFAULT_ATTESTATIONS=1

BUILDX_NO_DEFAULT_LOAD

当你使用 docker 驱动程序构建镜像时,构建完成后镜像会自动加载到镜像仓库。设置 BUILDX_NO_DEFAULT_LOAD 以禁用将镜像自动加载到本地容器仓库。

用法:

$ export BUILDX_NO_DEFAULT_LOAD=1