Bake 文件参考
Bake 文件是用于定义工作流的文件,你可以使用 docker buildx bake
运行这些工作流。
文件格式
你可以使用以下文件格式定义你的 Bake 文件
- HashiCorp 配置语言 (HCL)
- JSON
- YAML (Compose 文件)
默认情况下,Bake 使用以下查找顺序来查找配置文件
compose.yaml
compose.yml
docker-compose.yml
docker-compose.yaml
docker-bake.json
docker-bake.hcl
docker-bake.override.json
docker-bake.override.hcl
你可以使用 --file
标志显式指定文件位置
$ docker buildx bake --file ../docker/bake.hcl --print
如果你没有显式指定文件,Bake 会在当前工作目录中搜索文件。如果找到多个 Bake 文件,所有文件将合并为一个定义。文件按照查找顺序进行合并。这意味着如果你的项目既包含 compose.yaml
文件,又包含 docker-bake.hcl
文件,Bake 会先加载 compose.yaml
文件,然后加载 docker-bake.hcl
文件。
如果合并的文件包含重复的属性定义,这些定义将根据属性被合并或被最后出现的定义覆盖。以下属性将被最后出现的定义覆盖
target.cache-to
target.dockerfile-inline
target.dockerfile
target.outputs
target.platforms
target.pull
target.tags
target.target
例如,如果 compose.yaml
和 docker-bake.hcl
都定义了 tags
属性,将使用 docker-bake.hcl
中的定义。
$ cat compose.yaml
services:
webapp:
build:
context: .
tags:
- bar
$ cat docker-bake.hcl
target "webapp" {
tags = ["foo"]
}
$ docker buildx bake --print webapp
{
"group": {
"default": {
"targets": [
"webapp"
]
}
},
"target": {
"webapp": {
"context": ".",
"dockerfile": "Dockerfile",
"tags": [
"foo"
]
}
}
}
所有其他属性将被合并。例如,如果 compose.yaml
和 docker-bake.hcl
都为 labels
属性定义了唯一条目,所有条目都将被包含。同一标签的重复条目将被覆盖。
$ cat compose.yaml
services:
webapp:
build:
context: .
labels:
com.example.foo: "foo"
com.example.name: "Alice"
$ cat docker-bake.hcl
target "webapp" {
labels = {
"com.example.bar" = "bar"
"com.example.name" = "Bob"
}
}
$ docker buildx bake --print webapp
{
"group": {
"default": {
"targets": [
"webapp"
]
}
},
"target": {
"webapp": {
"context": ".",
"dockerfile": "Dockerfile",
"labels": {
"com.example.foo": "foo",
"com.example.bar": "bar",
"com.example.name": "Bob"
}
}
}
}
语法
Bake 文件支持以下属性类型
target
: 构建目标group
: 构建目标的集合variable
: 构建参数和变量function
: 自定义 Bake 函数
你在 Bake 文件中将属性定义为分层块。你可以为一个属性分配一个或多个属性。
以下代码片段展示了一个简单 Bake 文件的 JSON 表示形式。此 Bake 文件定义了三个属性:一个 variable、一个 group 和一个 target。
{
"variable": {
"TAG": {
"default": "latest"
}
},
"group": {
"default": {
"targets": ["webapp"]
}
},
"target": {
"webapp": {
"dockerfile": "Dockerfile",
"tags": ["docker.io/username/webapp:${TAG}"]
}
}
}
在 Bake 文件的 JSON 表示形式中,属性是对象,属性是分配给这些对象的值。
以下示例展示了相同 Bake 文件的 HCL 格式
variable "TAG" {
default = "latest"
}
group "default" {
targets = ["webapp"]
}
target "webapp" {
dockerfile = "Dockerfile"
tags = ["docker.io/username/webapp:${TAG}"]
}
HCL 是 Bake 文件的首选格式。除了语法差异外,HCL 允许你使用 JSON 和 YAML 格式不支持的特性。
本文档中的示例使用 HCL 格式。
Target
一个 target 反映了一个单独的 docker build
调用。考虑以下构建命令
$ docker build \
--file=Dockerfile.webapp \
--tag=docker.io/username/webapp:latest \
https://github.com/username/webapp
你可以按如下方式在 Bake 文件中表示此命令
target "webapp" {
dockerfile = "Dockerfile.webapp"
tags = ["docker.io/username/webapp:latest"]
context = "https://github.com/username/webapp"
}
下表显示了可以分配给 target 的完整属性列表
名称 | 类型 | 描述 |
---|---|---|
args | Map | 构建参数 |
annotations | List | 导出器注释 |
attest | List | 构建证明 |
cache-from | List | 外部缓存源 |
cache-to | List | 外部缓存目的地 |
call | String | 指定要为 target 调用的前端方法。 |
context | String | 位于指定路径或 URL 中的文件集 |
contexts | Map | 额外的构建上下文 |
description | String | target 的描述 |
dockerfile-inline | String | 内联 Dockerfile 字符串 |
dockerfile | String | Dockerfile 位置 |
inherits | List | 从其他 target 继承属性 |
labels | Map | 镜像元数据 |
matrix | Map | 定义一组变量,将一个 target 展开(forks)为多个 target。 |
name | String | 使用 matrix 时覆盖 target 名称。 |
no-cache-filter | List | 对特定阶段禁用构建缓存 |
no-cache | Boolean | 完全禁用构建缓存 |
output | List | 输出目的地 |
platforms | List | 目标平台 |
pull | Boolean | 始终拉取镜像 |
secret | List | 暴露给构建的 Secrets |
shm-size | List | /dev/shm 的大小 |
ssh | List | 暴露给构建的 SSH agent 套接字或密钥 |
tags | List | 镜像名称和标签 |
target | String | 目标构建阶段 |
ulimits | List | Ulimit 选项 |
target.args
使用 args
属性为 target 定义构建参数。这与向构建命令传递 --build-arg
标志具有相同的效果。
target "default" {
args = {
VERSION = "0.0.0+unknown"
}
}
你可以将 args
属性设置为使用 null
值。这样做会强制 target
使用 Dockerfile 中指定的 ARG
值。
variable "GO_VERSION" {
default = "1.20.3"
}
target "webapp" {
dockerfile = "webapp.Dockerfile"
tags = ["docker.io/username/webapp"]
}
target "db" {
args = {
GO_VERSION = null
}
dockerfile = "db.Dockerfile"
tags = ["docker.io/username/db"]
}
target.annotations
annotations
属性允许你为使用 Bake 构建的镜像添加注释。key 接受一个注释列表,格式为 KEY=VALUE
。
target "default" {
output = [{ type = "image", name = "foo" }]
annotations = ["org.opencontainers.image.authors=dvdksn"]
}
默认情况下,注释会添加到镜像清单中。你可以通过在注释前添加一个前缀来配置注释的级别,该前缀包含一个逗号分隔的列表,列出你想要注释的所有级别。以下示例同时向镜像索引和清单添加注释。
target "default" {
output = [{ type = "image", name = "foo" }]
annotations = ["index,manifest:org.opencontainers.image.authors=dvdksn"]
}
阅读 指定注释级别 了解支持的级别。
target.attest
attest
属性允许你对 target 应用 构建证明。此属性接受证明参数的长格式 CSV 版本。
target "default" {
attest = [
{
type = "provenance",
mode = "max",
},
{
type = "sbom",
}
]
}
target.cache-from
构建缓存源。构建器会从你指定的位置导入缓存。它使用 Buildx 缓存存储后端,其工作方式与 --cache-from
标志相同。这接受一个列表值,因此你可以指定多个缓存源。
target "app" {
cache-from = [
{
type = "s3",
region = "eu-west-1",
bucket = "mybucket"
},
{
type = "registry",
ref = "user/repo:cache"
}
]
}
target.cache-to
构建缓存导出目的地。构建器会将其构建缓存导出到你指定的位置。它使用 Buildx 缓存存储后端,其工作方式与 --cache-to
标志 相同。这接受一个列表值,因此你可以指定多个缓存导出目标。
target "app" {
cache-to = [
{
type = "s3",
region = "eu-west-1",
bucket = "mybucket"
},
{
type = "inline",
}
]
}
target.call
指定要使用的前端方法。前端方法允许你例如仅执行构建检查,而不是运行构建。这与 --call
标志相同。
target "app" {
call = "check"
}
支持的值包括
build
构建 target(默认)check
: 为 target 评估 构建检查outline
: 显示 target 的构建参数及其默认值(如果可用)targets
: 列出加载定义中的所有 Bake target 及其 描述。
有关前端方法的更多信息,请参考 docker buildx build --call
的命令行参考。
target.context
指定此 target 要使用的构建上下文的位置。接受 URL 或目录路径。这与你传递给构建命令的 构建上下文 位置参数相同。
target "app" {
context = "./src/www"
}
默认情况下,这解析为当前工作目录("."
)。
$ docker buildx bake --print -f - <<< 'target "default" {}'
[+] Building 0.0s (0/0)
{
"target": {
"default": {
"context": ".",
"dockerfile": "Dockerfile"
}
}
}
target.contexts
额外的构建上下文。这与 --build-context
标志 相同。此属性接受一个 Map,其中键将产生可在构建中引用的命名上下文。
您可以指定不同类型的上下文,例如本地目录、Git URL,甚至其他 Bake 目标。Bake 会根据上下文值的模式自动确定上下文的类型。
上下文类型 | 示例 |
---|---|
容器镜像 | docker-image://alpine@sha256:0123456789 |
Git URL | https://github.com/user/proj.git |
HTTP URL | https://example.com/files |
本地目录 | ../path/to/src |
Bake 目标 | target:base |
固定镜像版本
# docker-bake.hcl
target "app" {
contexts = {
alpine = "docker-image://alpine:3.13"
}
}
# Dockerfile
FROM alpine
RUN echo "Hello world"
使用本地目录
# docker-bake.hcl
target "app" {
contexts = {
src = "../path/to/source"
}
}
# Dockerfile
FROM scratch AS src
FROM golang
COPY --from=src . .
使用另一个目标作为基础
注意
您应该优先使用常规的多阶段构建而不是此选项。当您有多个无法轻松合并到单个文件中的 Dockerfile 时,可以使用此功能。
# docker-bake.hcl
target "base" {
dockerfile = "baseapp.Dockerfile"
}
target "app" {
contexts = {
baseapp = "target:base"
}
}
# Dockerfile
FROM baseapp
RUN echo "Hello world"
target.description
为目标定义人类可读的描述,阐明其用途或功能。
target "lint" {
description = "Runs golangci-lint to detect style errors"
args = {
GOLANGCI_LINT_VERSION = null
}
dockerfile = "lint.Dockerfile"
}
当与 docker buildx bake --list=targets
选项结合使用时,此属性非常有用,在列出 Bake 文件中可用的构建目标时提供更多信息。
target.dockerfile-inline
使用字符串值作为构建目标的内联 Dockerfile。
target "default" {
dockerfile-inline = "FROM alpine\nENTRYPOINT [\"echo\", \"hello\"]"
}
dockerfile-inline
优先于 dockerfile
属性。如果您同时指定两者,Bake 将使用内联版本。
target.dockerfile
用于构建的 Dockerfile 名称。这与 docker build
命令的 --file
标志 一样。
target "default" {
dockerfile = "./src/www/Dockerfile"
}
默认解析为 "Dockerfile"
。
$ docker buildx bake --print -f - <<< 'target "default" {}'
[+] Building 0.0s (0/0)
{
"target": {
"default": {
"context": ".",
"dockerfile": "Dockerfile"
}
}
}
target.entitlements
权限(Entitlements)是构建过程运行所需的权限。
目前支持的权限有
network.host
:允许构建使用访问主机网络的命令。在 Dockerfile 中,使用RUN --network=host
来运行启用主机网络的命令。security.insecure
:允许构建在非受限于默认安全沙箱的特权容器中运行命令。此类容器可能潜在地访问和修改系统资源。在 Dockerfile 中,使用RUN --security=insecure
来在特权容器中运行命令。
target "integration-tests" {
# this target requires privileged containers to run nested containers
entitlements = ["security.insecure"]
}
权限通过两步流程启用。首先,目标必须声明其所需的权限。其次,在调用 bake
命令时,用户必须通过传递 --allow
标志或在交互式终端中提示时确认权限来授予权限。这是为了确保用户知晓他们授予构建过程的可能不安全的权限。
target.inherits
一个目标可以继承其他目标的属性。使用 inherits
来引用一个目标到另一个。
在以下示例中,app-dev
目标指定了镜像名称和标签。app-release
目标使用 inherits
重用标签名称。
variable "TAG" {
default = "latest"
}
target "app-dev" {
tags = ["docker.io/username/myapp:${TAG}"]
}
target "app-release" {
inherits = ["app-dev"]
platforms = ["linux/amd64", "linux/arm64"]
}
inherits
属性是一个列表,这意味着您可以从多个其他目标重用属性。在以下示例中,app-release
目标重用了 app-dev
和 _release
目标的属性。
target "app-dev" {
args = {
GO_VERSION = "1.20"
BUILDX_EXPERIMENTAL = 1
}
tags = ["docker.io/username/myapp"]
dockerfile = "app.Dockerfile"
labels = {
"org.opencontainers.image.source" = "https://github.com/username/myapp"
}
}
target "_release" {
args = {
BUILDKIT_CONTEXT_KEEP_GIT_DIR = 1
BUILDX_EXPERIMENTAL = 0
}
}
target "app-release" {
inherits = ["app-dev", "_release"]
platforms = ["linux/amd64", "linux/arm64"]
}
从多个目标继承属性时,如果发生冲突,inherits
列表中最后出现的目标具有优先权。前面的示例为 app-release
目标定义了两次 BUILDX_EXPERIMENTAL
参数。它解析为 0
,因为 _release
目标出现在继承链的最后。
$ docker buildx bake --print app-release
[+] Building 0.0s (0/0)
{
"group": {
"default": {
"targets": [
"app-release"
]
}
},
"target": {
"app-release": {
"context": ".",
"dockerfile": "app.Dockerfile",
"args": {
"BUILDKIT_CONTEXT_KEEP_GIT_DIR": "1",
"BUILDX_EXPERIMENTAL": "0",
"GO_VERSION": "1.20"
},
"labels": {
"org.opencontainers.image.source": "https://github.com/username/myapp"
},
"tags": [
"docker.io/username/myapp"
],
"platforms": [
"linux/amd64",
"linux/arm64"
]
}
}
}
target.labels
为构建分配镜像标签。这与 docker build
的 --label
标志相同。
target "default" {
labels = {
"org.opencontainers.image.source" = "https://github.com/username/myapp"
"com.docker.image.source.entrypoint" = "Dockerfile"
}
}
可以使用 null
值作为标签。如果这样做,构建器将使用 Dockerfile 中指定的标签值。
target.matrix
矩阵策略(matrix strategy)允许您根据指定的参数将单个目标分叉为多个不同的变体。这与 GitHub Actions 的矩阵策略 工作方式类似。您可以使用它来减少 Bake 定义中的重复。
matrix
属性是一个将参数名称映射到值列表的映射(map)。Bake 会将值的每种可能的组合构建为一个单独的目标。
每个生成的目标必须具有唯一的名称。要指定目标名称如何解析,请使用 name
属性。
以下示例将 app
目标解析为 app-foo
和 app-bar
。它还使用矩阵值来定义 目标构建阶段。
target "app" {
name = "app-${tgt}"
matrix = {
tgt = ["foo", "bar"]
}
target = tgt
}
$ docker buildx bake --print app
[+] Building 0.0s (0/0)
{
"group": {
"app": {
"targets": [
"app-foo",
"app-bar"
]
},
"default": {
"targets": [
"app"
]
}
},
"target": {
"app-bar": {
"context": ".",
"dockerfile": "Dockerfile",
"target": "bar"
},
"app-foo": {
"context": ".",
"dockerfile": "Dockerfile",
"target": "foo"
}
}
}
多个轴
您可以在矩阵中指定多个键,以在多个轴上分叉目标。使用多个矩阵键时,Bake 会构建所有可能的变体。
以下示例构建四个目标
app-foo-1-0
app-foo-2-0
app-bar-1-0
app-bar-2-0
target "app" {
name = "app-${tgt}-${replace(version, ".", "-")}"
matrix = {
tgt = ["foo", "bar"]
version = ["1.0", "2.0"]
}
target = tgt
args = {
VERSION = version
}
}
每个矩阵目标多个值
如果您想在单个值之外区分矩阵,可以使用映射(map)作为矩阵值。Bake 会为每个映射创建一个目标,您可以使用点符号访问嵌套值。
以下示例构建两个目标
app-foo-1-0
app-bar-2-0
target "app" {
name = "app-${item.tgt}-${replace(item.version, ".", "-")}"
matrix = {
item = [
{
tgt = "foo"
version = "1.0"
},
{
tgt = "bar"
version = "2.0"
}
]
}
target = item.tgt
args = {
VERSION = item.version
}
}
target.name
为使用矩阵策略的目标指定名称解析。以下示例将 app
目标解析为 app-foo
和 app-bar
。
target "app" {
name = "app-${tgt}"
matrix = {
tgt = ["foo", "bar"]
}
target = tgt
}
target.network
为整个构建请求设置网络模式。这将覆盖 Dockerfile 中所有 RUN
指令的默认网络模式。可接受的值为 default
、host
和 none
。
通常,为构建步骤设置网络模式更好的方法是在 Dockerfile 中使用 RUN --network=<value>
。这样,您可以为单个构建步骤设置网络模式,并且所有构建 Dockerfile 的人都无需向构建命令传递额外的标志即可获得一致的行为。
如果您在 Bake 文件中将网络模式设置为 host
,则在调用 bake
命令时也必须授予 network.host
权限。这是因为 host
网络模式需要提升权限并可能存在安全风险。您可以通过向 docker buildx bake
命令传递 --allow=network.host
来授予权限,或者如果您使用的是交互式终端,可以在提示时确认权限。
target "app" {
# make sure this build does not access internet
network = "none"
}
target.no-cache-filter
不使用指定阶段的构建缓存。这与 docker build
的 --no-cache-filter
标志相同。以下示例避免对 foo
构建阶段使用构建缓存。
target "default" {
no-cache-filter = ["foo"]
}
target.no-cache
构建镜像时不使用缓存。这与 docker build
的 --no-cache
标志相同。
target "default" {
no-cache = 1
}
target.output
用于导出构建输出的配置。这与 --output
标志 相同。以下示例将目标配置为使用仅缓存输出,
target "default" {
output = [{ type = "cacheonly" }]
}
target.platforms
为构建目标设置目标平台。这与 --platform
标志 相同。以下示例创建了针对三种架构的多平台构建。
target "default" {
platforms = ["linux/amd64", "linux/arm64", "linux/arm/v7"]
}
target.pull
配置构建器在构建目标时是否尝试拉取镜像。这与 docker build
的 --pull
标志相同。以下示例强制构建器总是拉取构建目标中引用的所有镜像。
target "default" {
pull = true
}
target.secret
定义要暴露给构建目标的 secrets。这与 --secret
标志 相同。
variable "HOME" {
default = null
}
target "default" {
secret = [
{ type = "env", id = "KUBECONFIG" },
{ type = "file", id = "aws", src = "${HOME}/.aws/credentials" },
]
}
这使您可以在 Dockerfile 中挂载 secret。
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
aws cloudfront create-invalidation ...
RUN --mount=type=secret,id=KUBECONFIG,env=KUBECONFIG \
helm upgrade --install
target.shm-size
使用 RUN
指令时,设置分配给构建容器的共享内存大小。
格式为 <number><unit>
。number
必须大于 0
。单位是可选的,可以是 b
(字节)、k
(千字节)、m
(兆字节) 或 g
(千兆字节)。如果省略单位,系统将使用字节。
这与 docker build
的 --shm-size
标志相同。
target "default" {
shm-size = "128m"
}
注意
在大多数情况下,建议让构建器自动确定适当的配置。只有在复杂构建场景需要特定的性能调优时,才应考虑手动调整。
target.ssh
定义要暴露给构建的 SSH 代理套接字或密钥。这与 --ssh
标志 相同。如果您需要在构建期间访问私有仓库,这会很有用。
target "default" {
ssh = [{ id = "default" }]
}
FROM alpine
RUN --mount=type=ssh \
apk add git openssh-client \
&& install -m 0700 -d ~/.ssh \
&& ssh-keyscan github.com >> ~/.ssh/known_hosts \
&& git clone git@github.com:user/my-private-repo.git
target.tags
用于构建目标的镜像名称和标签。这与 --tag
标志 相同。
target "default" {
tags = [
"org/repo:latest",
"myregistry.azurecr.io/team/image:v1"
]
}
target.target
设置要构建的目标构建阶段。这与 --target
标志 相同。
target "default" {
target = "binaries"
}
target.ulimits
Ulimits 覆盖了使用 RUN
指令时构建容器的默认 ulimits,并指定了软限制和硬限制,例如:<type>=<soft limit>[:<hard limit>]
,例如
target "app" {
ulimits = [
"nofile=1024:1024"
]
}
注意
如果您不提供
hard limit
,则将soft limit
用于两个值。如果没有设置ulimits
,它们将继承自守护进程上设置的默认ulimits
。
注意
在大多数情况下,建议让构建器自动确定适当的配置。只有在复杂构建场景需要特定的性能调优时,才应考虑手动调整。
Group
组(Groups)允许您一次调用多个构建(目标)。
group "default" {
targets = ["db", "webapp-dev"]
}
target "webapp-dev" {
dockerfile = "Dockerfile.webapp"
tags = ["docker.io/username/webapp:latest"]
}
target "db" {
dockerfile = "Dockerfile.db"
tags = ["docker.io/username/db"]
}
如果组和目标存在同名,则组具有优先权。以下 bake 文件构建了 default
组。Bake 将忽略 default
目标。
target "default" {
dockerfile-inline = "FROM ubuntu"
}
group "default" {
targets = ["alpine", "debian"]
}
target "alpine" {
dockerfile-inline = "FROM alpine"
}
target "debian" {
dockerfile-inline = "FROM debian"
}
Variable
HCL 文件格式支持变量块定义。您可以将变量用作 Dockerfile 中的构建参数,或将其插值到 Bake 文件中的属性值。
variable "TAG" {
default = "latest"
}
target "webapp-dev" {
dockerfile = "Dockerfile.webapp"
tags = ["docker.io/username/webapp:${TAG}"]
}
您可以在 Bake 文件中为变量分配默认值,或为其分配 null
值。如果分配 null
值,Buildx 将改为使用 Dockerfile 中的默认值。
您可以使用环境变量覆盖 Bake 文件中设置的变量默认值。以下示例将 TAG
变量设置为 dev
,覆盖了上一个示例中显示的默认值 latest
。
$ TAG=dev docker buildx bake webapp-dev
内置变量
以下变量是内置变量,您无需定义即可在 Bake 中使用它们。
Variable | 描述 |
---|---|
BAKE_CMD_CONTEXT | 使用远程 Bake 文件构建时,持有主要上下文。 |
BAKE_LOCAL_PLATFORM | 返回当前平台的默认平台规范(例如 linux/amd64 )。 |
使用环境变量作为默认值
您可以将 Bake 变量设置为使用环境变量的值作为默认值
variable "HOME" {
default = "$HOME"
}
将变量插值到属性中
要将变量插值到属性字符串值中,您必须使用大括号。以下不起作用
variable "HOME" {
default = "$HOME"
}
target "default" {
ssh = ["default=$HOME/.ssh/id_rsa"]
}
在您想要插入变量的地方将其用大括号括起来
variable "HOME" {
default = "$HOME"
}
target "default" {
- ssh = ["default=$HOME/.ssh/id_rsa"]
+ ssh = ["default=${HOME}/.ssh/id_rsa"]
}
在将变量插值到属性中之前,您必须先在 bake 文件中声明它,如下例所示。
$ cat docker-bake.hcl
target "default" {
dockerfile-inline = "FROM ${BASE_IMAGE}"
}
$ docker buildx bake
[+] Building 0.0s (0/0)
docker-bake.hcl:2
--------------------
1 | target "default" {
2 | >>> dockerfile-inline = "FROM ${BASE_IMAGE}"
3 | }
4 |
--------------------
ERROR: docker-bake.hcl:2,31-41: Unknown variable; There is no variable named "BASE_IMAGE"., and 1 other diagnostic(s)
$ cat >> docker-bake.hcl
variable "BASE_IMAGE" {
default = "alpine"
}
$ docker buildx bake
[+] Building 0.6s (5/5) FINISHED
函数
# docker-bake.hcl
target "webapp-dev" {
dockerfile = "Dockerfile.webapp"
tags = ["docker.io/username/webapp:latest"]
args = {
buildno = "${add(123, 1)}"
}
}
此外,还支持 用户自定义函数
# docker-bake.hcl
function "increment" {
params = [number]
result = number + 1
}
target "webapp-dev" {
dockerfile = "Dockerfile.webapp"
tags = ["docker.io/username/webapp:latest"]
args = {
buildno = "${increment(123)}"
}
}
注意
有关更多详细信息,请参阅用户自定义 HCL 函数 页面。