Compose 构建规范
Build 是 Compose 规范的可选部分。它告诉 Compose 如何从源代码(重新)构建应用程序,并允许你以可移植的方式在 Compose 文件中定义构建过程。build 可以指定为定义上下文路径的单个字符串,也可以指定为详细的构建定义。
在前一种情况下,整个路径用作 Docker 上下文来执行 Docker 构建,并在目录根目录中查找规范的 Dockerfile。路径可以是绝对路径或相对路径。如果它是相对路径,则从包含 Compose 文件的目录解析。如果它是绝对路径,则该路径会阻止 Compose 文件的可移植性,因此 Compose 会显示警告。
在后一种情况下,可以指定构建参数,包括备用的 Dockerfile 位置。路径可以是绝对路径或相对路径。如果它是相对路径,则从包含 Compose 文件的目录解析。如果它是绝对路径,则该路径会阻止 Compose 文件的可移植性,因此 Compose 会显示警告。
使用 build 和 image
当 Compose 遇到服务的 build 子部分和 image 属性时,它遵循由 pull_policy 属性定义的规则。
如果服务定义中缺少 pull_policy,Compose 会尝试首先拉取镜像,如果注册表或平台缓存中未找到该镜像,则从源代码构建。
发布已构建镜像
支持 build 的 Compose 提供了将构建镜像推送到注册表的选项。在此过程中,它不会尝试推送没有 image 属性的服务镜像。Compose 会警告你缺少 image 属性,这会阻止镜像被推送。
示例说明
以下示例通过具体的示例应用程序说明了 Compose 构建规范概念。该示例是非规范性的。
services:
frontend:
image: example/webapp
build: ./webapp
backend:
image: example/database
build:
context: backend
dockerfile: ../backend.Dockerfile
custom:
build: ~/custom当用于从源代码构建服务镜像时,Compose 文件会创建三个 Docker 镜像
example/webapp:Docker 镜像使用 Compose 文件文件夹内的webapp子目录作为 Docker 构建上下文进行构建。此文件夹中缺少Dockerfile会返回错误。example/database:Docker 镜像使用 Compose 文件文件夹内的backend子目录进行构建。backend.Dockerfile文件用于定义构建步骤,此文件相对于上下文路径进行搜索,这意味着..解析为 Compose 文件文件夹,因此backend.Dockerfile是一个同级文件。- Docker 镜像使用用户
$HOME中的custom目录作为 Docker 上下文进行构建。Compose 会显示有关用于构建镜像的不可移植路径的警告。
推送时,example/webapp 和 example/database Docker 镜像都会推送到默认注册表。custom 服务镜像被跳过,因为没有设置 image 属性,Compose 会显示有关此缺失属性的警告。
属性
build 子部分定义了 Compose 应用于从源代码构建 Docker 镜像的配置选项。build 可以指定为包含构建上下文路径的字符串,也可以指定为详细结构。
使用字符串语法时,只能将构建上下文配置为
Compose 文件文件夹的相对路径。此路径必须是一个目录,并且必须包含一个
Dockerfile。services: webapp: build: ./dirGit 存储库 URL。Git URL 在其片段部分接受上下文配置,用冒号 (
:) 分隔。第一部分表示 Git 检出的引用,可以是分支、标签或远程引用。第二部分表示存储库内用作构建上下文的子目录。services: webapp: build: https://github.com/mycompany/example.git#branch_or_tag:subdirectory
或者,build 可以是具有以下定义的字段的对象
additional_contexts
additional_contexts 定义了镜像构建器在镜像构建过程中应使用的命名上下文列表。
additional_contexts 可以是映射或列表。
build:
context: .
additional_contexts:
- resources=/path/to/resources
- app=docker-image://my-app:latest
- source=https://github.com/myuser/project.gitbuild:
context: .
additional_contexts:
resources: /path/to/resources
app: docker-image://my-app:latest
source: https://github.com/myuser/project.git用作列表时,语法遵循 NAME=VALUE 格式,其中 VALUE 是一个字符串。超出此范围的验证是镜像构建器(并且是构建器特定的)的责任。Compose 至少支持目录的绝对路径和相对路径以及 Git 存储库 URL,就像 context 一样。其他上下文类型必须加上前缀以避免与 type:// 前缀产生歧义。
如果镜像构建器不支持额外的上下文,Compose 会发出警告,并可能列出未使用的上下文。
有关 Buildx 中如何使用此功能的说明性示例,请参阅此处。
additional_contexts 还可以引用由另一个服务构建的镜像。这允许使用另一个服务镜像作为基础镜像来构建服务镜像,并在服务镜像之间共享层。
services:
base:
build:
context: .
dockerfile_inline: |
FROM alpine
RUN ...
my-service:
build:
context: .
dockerfile_inline: |
FROM base # image built for service base
RUN ...
additional_contexts:
base: service:baseargs
args 定义构建参数,即 Dockerfile ARG 值。
以下 Dockerfile 为例
ARG GIT_COMMIT
RUN echo "Based on commit: $GIT_COMMIT"args 可以在 Compose 文件中的 build 键下设置,以定义 GIT_COMMIT。args 可以设置为映射或列表。
build:
context: .
args:
GIT_COMMIT: cdc3b19build:
context: .
args:
- GIT_COMMIT=cdc3b19在指定构建参数时可以省略值,在这种情况下,其构建时值必须通过用户交互获得,否则在构建 Docker 镜像时不会设置构建参数。
args:
- GIT_COMMITcache_from
cache_from 定义了镜像构建器应用于缓存解析的源列表。
缓存位置语法遵循全局格式 [NAME|type=TYPE[,KEY=VALUE]]。简单的 NAME 实际上是 type=registry,ref=NAME 的快捷方式。
Compose 构建实现可能支持自定义类型,Compose 规范定义了必须支持的规范类型。
registry用于从由键ref设置的 OCI 镜像中检索构建缓存。
build:
context: .
cache_from:
- alpine:latest
- type=local,src=path/to/cache
- type=gha不支持的缓存会被忽略,不会阻止你构建镜像。
cache_to
cache_to 定义了用于与未来构建共享构建缓存的导出位置列表。
build:
context: .
cache_to:
- user/app:cache
- type=local,dest=path/to/cache缓存目标使用与 cache_from 定义的相同的 type=TYPE[,KEY=VALUE] 语法进行定义。
不支持的缓存会被忽略,不会阻止你构建镜像。
context
context 定义了包含 Dockerfile 的目录路径,或 Git 存储库的 URL。
当提供的值是相对路径时,它被解释为相对于项目目录。Compose 会警告你用于定义构建上下文的绝对路径,因为这些路径会阻止 Compose 文件的可移植性。
build:
context: ./dirservices:
webapp:
build: https://github.com/mycompany/webapp.git如果未明确设置,context 默认为项目目录 (.)。
dockerfile
dockerfile 设置备用 Dockerfile。相对路径从构建上下文解析。Compose 会警告你用于定义 Dockerfile 的绝对路径,因为它会阻止 Compose 文件的可移植性。
设置后,不允许使用 dockerfile_inline 属性,并且 Compose 会拒绝任何同时设置这两个属性的 Compose 文件。
build:
context: .
dockerfile: webapp.Dockerfiledockerfile_inline
dockerfile_inline 将 Dockerfile 内容定义为 Compose 文件中的内联字符串。设置后,不允许使用 dockerfile 属性,并且 Compose 会拒绝任何同时设置这两个属性的 Compose 文件。
建议使用 YAML 多行字符串语法来定义 Dockerfile 内容。
build:
context: .
dockerfile_inline: |
FROM baseimage
RUN some commandentitlements
entitlements 定义了在构建期间允许的额外特权权限。
entitlements:
- network.host
- security.insecureextra_hosts
extra_hosts 在构建时添加主机名映射。使用与 extra_hosts 相同的语法。
extra_hosts:
- "somehost=162.242.195.82"
- "otherhost=50.31.209.229"
- "myhostv6=::1"IPv6 地址可以括在方括号中,例如
extra_hosts:
- "myhostv6=[::1]"首选分隔符 =,但也可以使用 :。在 Docker Compose 2.24.1 版本中引入。例如
extra_hosts:
- "somehost:162.242.195.82"
- "myhostv6:::1"Compose 在容器的网络配置中创建与 IP 地址和主机名匹配的条目,这意味着对于 Linux,/etc/hosts 将获得额外的行。
162.242.195.82 somehost
50.31.209.229 otherhost
::1 myhostv6isolation
isolation 指定构建的容器隔离技术。与 isolation 一样,支持的值是平台特定的。
labels
labels 将元数据添加到生成的镜像。labels 可以设置为数组或映射。
建议使用反向 DNS 表示法,以防止你的标签与其他软件冲突。
build:
context: .
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""build:
context: .
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"网络
设置在构建期间 RUN 指令连接的网络容器。
build:
context: .
network: hostbuild:
context: .
network: custom_network_1使用 none 在构建期间禁用网络。
build:
context: .
network: noneno_cache
no_cache 禁用镜像构建器缓存,并强制所有镜像层从源代码完全重建。这仅适用于 Dockerfile 中声明的层,只要注册表上的标签已更新,就可以从本地镜像存储中检索引用的镜像(请参阅 pull)。
platforms
platforms 定义了目标 平台 列表。
build:
context: "."
platforms:
- "linux/amd64"
- "linux/arm64"当省略 platforms 属性时,Compose 会将服务的平台包含在默认构建目标平台列表中。
当定义了 platforms 属性时,Compose 会包含服务的平台,否则用户将无法运行他们构建的镜像。
在以下情况下,Compose 会报告错误
当列表中包含多个平台,但实现无法存储多平台镜像时。
当列表中包含不支持的平台时。
build: context: "." platforms: - "linux/amd64" - "unsupported/unsupported"当列表非空且不包含服务的平台时。
services: frontend: platform: "linux/amd64" build: context: "." platforms: - "linux/arm64"
privileged
privileged 配置服务镜像以提升权限进行构建。支持和实际影响是平台特定的。
build:
context: .
privileged: trueprovenance
provenance 配置构建器将 来源证明 添加到已发布的镜像中。
该值可以是布尔值以启用/禁用来源证明,也可以是 key=value 字符串以设置来源配置。你可以通过设置 mode 参数来选择要包含在来源证明中的详细程度。
build:
context: .
provenance: truebuild:
context: .
provenance: mode=maxpull
pull 要求镜像构建器拉取引用的镜像(FROM Dockerfile 指令),即使这些镜像已在本地镜像存储中可用。
sbom
sbom 配置构建器将 来源证明 添加到已发布的镜像中。该值可以是布尔值以启用/禁用 SBOM 证明,也可以是 key=value 字符串以设置 SBOM 生成器配置。这允许你选择备用的 SBOM 生成器镜像(请参阅 https://github.com/moby/buildkit/blob/master/docs/attestations/sbom-protocol.md)。
build:
context: .
sbom: truebuild:
context: .
sbom: generator=docker/scout-sbom-indexer:latest # Use an alternative SBOM generatorsecrets
secrets 授予对按服务构建定义的 secrets 敏感数据的访问权限。支持两种不同的语法变体:短语法和长语法。
如果秘密未在此 Compose 文件的 secrets 部分中定义,Compose 会报告错误。
短语法
短语法变体仅指定秘密名称。这授予容器对秘密的访问权限,并将其作为只读文件挂载到容器内的 /run/secrets/<secret_name>。源名称和目标挂载点都设置为秘密名称。
以下示例使用短语法授予 frontend 服务的构建访问 server-certificate 秘密的权限。server-certificate 的值设置为文件 ./server.cert 的内容。
services:
frontend:
build:
context: .
secrets:
- server-certificate
secrets:
server-certificate:
file: ./server.cert长语法
长语法提供了更精细的控制,用于在服务的容器中创建秘密。
source:秘密在平台上的名称。target:Dockerfile 中声明的秘密 ID。如果未指定,则默认为source。uid和gid:服务任务容器中/run/secrets/中文件的数字 uid 或 gid。默认值为USER。mode:服务任务容器中/run/secrets/中要挂载的文件的权限,以八进制表示。默认值为全局可读权限(模式0444)。如果设置了可写位,则必须忽略。可执行位可以设置。
以下示例将 server-certificate 秘密文件名在容器内设置为 server.crt,将模式设置为 0440(组可读),并将用户和组设置为 103。server-certificate 秘密的值由平台通过查找提供,秘密生命周期不由 Compose 直接管理。
services:
frontend:
build:
context: .
secrets:
- source: server-certificate
target: cert # secret ID in Dockerfile
uid: "103"
gid: "103"
mode: 0440
secrets:
server-certificate:
external: true# Dockerfile
FROM nginx
RUN --mount=type=secret,id=cert,required=true,target=/root/cert ...服务构建可以获得对多个秘密的访问权限。秘密的长语法和短语法可以在同一个 Compose 文件中使用。在顶级 secrets 中定义秘密不应意味着授予任何服务构建访问该秘密的权限。此类授予必须在服务规范中明确声明为 secrets 服务元素。
ssh
ssh 定义了镜像构建器在镜像构建过程中应使用的 SSH 认证(例如,克隆私有存储库)。
ssh 属性语法可以是以下之一
default:让构建器连接到 SSH 代理。ID=path:ID 及其关联路径的键/值定义。它可以是 PEM 文件,也可以是 SSH 代理套接字的路径。
build:
context: .
ssh:
- default # mount the default SSH agent或
build:
context: .
ssh: ["default"] # mount the default SSH agent使用自定义 ID myproject 和本地 SSH 密钥的路径。
build:
context: .
ssh:
- myproject=~/.ssh/myproject.pem镜像构建器随后可以依靠此在构建期间挂载 SSH 密钥。
为了说明,SSH 挂载 可用于通过 ID 挂载 SSH 密钥并访问受保护资源。
RUN --mount=type=ssh,id=myproject git clone ...
shm_size
shm_size 设置为构建 Docker 镜像分配的共享内存大小(Linux 上的 /dev/shm 分区)。指定为表示字节数的整数值或表示字节值的字符串。
build:
context: .
shm_size: '2gb'build:
context: .
shm_size: 10000000tags
tags 定义了必须与构建镜像关联的标签映射列表。此列表是服务部分中定义的 image 属性的补充。
tags:
- "myimage:mytag"
- "registry/username/myrepos:my-other-tag"target
target 定义了在多阶段 Dockerfile 中定义的要构建的阶段。
build:
context: .
target: produlimits
ulimits 覆盖容器的默认 ulimits。它指定为单个限制的整数或软/硬限制的映射。
services:
frontend:
build:
context: .
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000