撰写构建规范
笔记:
构建是 Compose 规范的可选部分
专注于在本地计算机上运行应用程序的 Compose 实现还需要支持从源代码(重新)构建应用程序。 Compose 构建规范允许您以可移植的方式在 Compose 文件中定义构建过程。
build
可以指定为定义上下文路径的单个字符串,也可以指定为详细的构建定义。
在前一种情况下,整个路径用作 Docker 上下文来执行 Docker 构建,
Dockerfile
在目录的根目录中查找规范。该路径可以是绝对路径或相对路径。如果是相对的,则从 Compose 文件的父文件夹中解析。如果是绝对路径,则该路径会阻止 Compose 文件可移植,因此 Compose 会显示警告。
在后一种情况下,可以指定构建参数,包括备用Dockerfile
位置。该路径可以是绝对路径或相对路径。如果是相对的,则从 Compose 文件的父文件夹中解析。如果是绝对路径,则该路径会阻止 Compose 文件可移植,因此 Compose 会显示警告。
使用构建和镜像
当 Compose 遇到build
服务的子部分和image
属性时,它遵循属性定义的规则
pull_policy
。
如果pull_policy
服务定义中缺少该镜像,Compose 将首先尝试提取该镜像,然后在注册表或平台缓存中未找到该镜像时从源构建。
发布构建的图像
Compose with build
support 提供了将构建的映像推送到注册表的选项。这样做时,它不会尝试推送没有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 映像是使用webapp
Compose 文件的父文件夹中的子目录构建的,作为 Docker 构建上下文。此文件夹中缺少 aDockerfile
会引发错误。example/database
:Docker 映像是使用backend
Compose 文件父文件夹中的子目录构建的。backend.Dockerfile
file 用于定义构建步骤,相对于上下文路径搜索该文件,这意味着..
解析到 Compose 文件的父文件夹,因此backend.Dockerfile
也是同级文件。- Docker 镜像是使用
custom
以用户 HOME 为 Docker 上下文的目录构建的。 Compose 显示有关用于构建映像的不可移植路径的警告。
推送时, Dockerexample/webapp
镜像example/database
都会推送到默认注册表。custom
由于未设置任何属性,因此会跳过服务映像,image
并且 Compose 会显示有关此缺失属性的警告。
属性
本build
小节定义了 Compose 用于从源构建 Docker 映像的配置选项。
build
可以指定为包含构建上下文路径的字符串或详细结构:
使用字符串语法,只有构建上下文可以配置为:
Compose 文件的父文件夹的相对路径。该路径必须是一个目录并且必须包含
Dockerfile
services: webapp: build: ./dir
git 存储库 URL。 Git URL 在其片段部分接受上下文配置,以冒号 (
:
) 分隔。第一部分表示 Git 签出的引用,可以是分支、标签或远程引用。第二部分表示存储库内用作构建上下文的子目录。services: webapp: build: https://github.com/mycompany/example.git#branch_or_tag:subdirectory
或者build
可以是具有如下定义字段的对象:
语境
context
定义包含 Dockerfile 的目录的路径,或 git 存储库的 URL。
当提供的值是相对路径时,它将被解释为相对于 Compose 文件的位置。 Compose 会警告您有关用于定义构建上下文的绝对路径,因为这些路径会阻止 Compose 文件的可移植性。
build:
context: ./dir
services:
webapp:
build: https://github.com/mycompany/webapp.git
如果未明确设置,context
则默认为项目目录 ( .
)。
docker文件
dockerfile
设置备用 Dockerfile。相对路径是从构建上下文解析的。 Compose 会警告您有关用于定义 Dockerfile 的绝对路径,因为它会阻止 Compose 文件的可移植性。
设置后,dockerfile_inline
不允许使用属性,并且 Compose 会拒绝任何同时设置了这两种属性的 Compose 文件。
build:
context: .
dockerfile: webapp.Dockerfile
dockerfile_内联
dockerfile_inline
将 Dockerfile 内容定义为 Compose 文件中的内联字符串。设置后,dockerfile
不允许使用该属性,并且 Compose 会拒绝任何同时设置了这两个属性的 Compose 文件。
建议使用 YAML 多行字符串语法来定义 Dockerfile 内容:
build:
context: .
dockerfile_inline: |
FROM baseimage
RUN some command
参数
args
定义构建参数,即 DockerfileARG
值。
使用以下 Dockerfile 作为示例:
ARG GIT_COMMIT
RUN echo "Based on commit: $GIT_COMMIT"
args
可以在Compose文件下设置build
键来定义GIT_COMMIT
。args
可以设置为映射或列表:
build:
context: .
args:
GIT_COMMIT: cdc3b19
build:
context: .
args:
- GIT_COMMIT=cdc3b19
指定构建参数时可以省略值,在这种情况下,构建时的值必须通过用户交互获取,否则在构建 Docker 映像时将不会设置构建参数。
args:
- GIT_COMMIT
SSH
ssh
定义镜像构建器在镜像构建期间应使用的 SSH 身份验证(例如,克隆私有存储库)。
ssh
属性语法可以是:
default
:让构建器连接到 ssh-agent。ID=path
:ID 和关联路径的键/值定义。它可以是 PEM文件,也可以是 ssh-agent 套接字的路径。
build:
context: .
ssh:
- default # mount the default ssh agent
或者
build:
context: .
ssh: ["default"] # mount the default ssh agent
myproject
使用带有本地 SSH 密钥路径的自定义 ID :
build:
context: .
ssh:
- myproject=~/.ssh/myproject.pem
然后,映像构建器可以依靠它在构建过程中挂载 SSH 密钥。例如, BuildKit 扩展语法可用于安装按 ID 设置的 SSH 密钥并访问受保护的资源:
RUN --mount=type=ssh,id=myproject git clone ...
缓存来源
cache_from
定义图像生成器应用于缓存解析的源列表。
缓存位置语法遵循全局格式[NAME|type=TYPE[,KEY=VALUE]]
。 SimpleNAME
实际上是 的快捷表示法type=registry,ref=NAME
。
Compose Build 实现可能支持自定义类型,Compose 规范定义了必须支持的规范类型:
registry
从按键设置的 OCI 映像中检索构建缓存ref
build:
context: .
cache_from:
- alpine:latest
- type=local,src=path/to/cache
- type=gha
不支持的缓存将被忽略,并且不会阻止您构建图像。
缓存到
cache_to
定义用于与未来构建共享构建缓存的导出位置列表。
build:
context: .
cache_to:
- user/app:cache
- type=local,dest=path/to/cache
缓存目标是使用type=TYPE[,KEY=VALUE]
与
cache_from
.
不支持的缓存将被忽略,并且不会阻止您构建图像。
附加上下文
additional_contexts
定义映像生成器在映像生成期间应使用的命名上下文列表。
additional_contexts
可以是映射或列表:
build:
context: .
additional_contexts:
- resources=/path/to/resources
- app=docker-image://my-app:latest
- source=https://github.com/myuser/project.git
build:
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,就像
上下文一样。其他上下文风格必须添加前缀以避免前缀引起歧义type://
。
如果映像生成器不支持其他上下文,Compose 会向您发出警告,并且可能会列出未使用的上下文。
可以在此处找到有关如何在 Buildx 中使用此功能的说明性示例 。
额外主机
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 myhostv6
隔离
isolation
指定构建的容器隔离技术。与隔离一样
,支持的值是特定于平台的。
特权
privileged
配置服务映像以使用提升的权限进行构建。支持和实际影响因平台而异。
build:
context: .
privileged: true
标签
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"
无缓存
no_cache
禁用图像生成器缓存并强制从所有图像层的源完全重建。这仅适用于 Dockerfile 中声明的层,只要在注册表上更新标签(请参阅
pull),就可以从本地映像存储中检索引用的映像。
拉
pull
要求镜像生成器拉取引用的镜像(FROM
Dockerfile 指令),即使这些镜像已经在本地镜像存储中可用。
网络
设置网络容器连接以获取RUN
构建期间的说明。
build:
context: .
network: host
build:
context: .
network: custom_network_1
用于none
在构建期间禁用网络:
build:
context: .
network: none
shm_大小
shm_size
/dev/shm
设置为构建 Docker 映像分配的共享内存(Linux 上的分区)的大小。指定为表示字节数的整数值或表示
字节值的字符串。
build:
context: .
shm_size: '2gb'
build:
context: .
shm_size: 10000000
目标
target
定义要构建的阶段,如多阶段中定义的那样Dockerfile
。
build:
context: .
target: prod
秘密
secrets
授予对每个服务构建基础上秘密定义的敏感数据的访问权限
。支持两种不同的语法变体:短语法和长语法。
secrets
如果此 Compose 文件的部分中未定义密钥,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
/run/secrets/
:要挂载到服务任务容器中的文件的名称。source
如果未指定则默认为。uid
和:拥有服务任务容器中gid
的文件的数字 UID 或 GID 。/run/secrets/
默认值是运行容器的用户。mode
: 要 在服务的任务容器中安装的文件的权限/run/secrets/
,以八进制表示法。默认值是世界可读的权限(mode0444
)。如果设置了可写位,则必须忽略该位。可以设置可执行位。
以下示例将机密文件的名称设置server-certificate
为server.crt
在容器内,将模式设置为0440
(组可读)并将用户和组设置为103
。 Secret的值server-certificate
由平台通过查找提供,并且 Secret 生命周期不由 Compose 直接管理。
services:
frontend:
build:
context: .
secrets:
- source: server-certificate
target: server.cert
uid: "103"
gid: "103"
mode: 0440
secrets:
server-certificate:
external: true
服务构建可以被授予对多个秘密的访问权限。秘密的长语法和短语法可以在同一个 Compose 文件中使用。在顶层定义机密secrets
并不意味着授予任何服务构建对其的访问权限。此类授权必须在服务规范中明确作为
秘密服务元素。
标签
tags
定义必须与构建映像关联的标签映射列表。此列表是对服务部分中定义的属性的补充image
tags:
- "myimage:mytag"
- "registry/username/myrepos:my-other-tag"
极限值
ulimits
覆盖容器的默认 ulimit。它被指定为单个限制的整数或软/硬限制的映射。
services:
frontend:
build:
context: .
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
平台
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"