community.docker.docker_image_build 模块 – 使用 Docker buildx 构建 Docker 镜像

注意

此模块是 community.docker 集合(版本 4.1.0)的一部分。

如果您正在使用 ansible 包,您可能已经安装了此集合。它不包含在 ansible-core 中。要检查是否已安装,请运行 ansible-galaxy collection list

要安装它,请使用:ansible-galaxy collection install community.docker。您需要进一步的要求才能使用此模块,请参阅 要求 了解详细信息。

要在 playbook 中使用它,请指定:community.docker.docker_image_build

community.docker 3.6.0 中的新功能

概要

  • 此模块允许您使用 Docker 的 buildx 插件 (BuildKit) 构建 Docker 镜像。

  • 请注意,该模块在经典 Ansible 模块的意义上是非幂等的。唯一的幂等性检查是已构建的镜像是否已存在。可以使用 rebuild 选项禁用此检查。

要求

在执行此模块的主机上需要以下要求。

  • 带有 Docker buildx 插件的 Docker CLI

参数

参数

注释

api_version

别名:docker_api_version

字符串

在 Docker 主机上运行的 Docker API 的版本。

默认为此集合和 docker 守护程序支持的最新版本的 API。

如果未在任务中指定该值,则将改用环境变量 DOCKER_API_VERSION 的值。如果未设置环境变量,则将使用默认值。

默认值: "auto"

args

字典

提供一个 key:value 构建参数的字典,该参数映射到 Dockerfile ARG 指令。

Docker 期望该值为字符串。为方便起见,任何非字符串值都将转换为字符串。

ca_path

别名:ca_cert, tls_ca_cert, cacert_path

路径

通过提供 CA 证书文件的路径,在执行服务器验证时使用 CA 证书。

如果未在任务中指定该值且设置了环境变量 DOCKER_CERT_PATH,则将使用环境变量 DOCKER_CERT_PATH 中指定的目录中的 ca.pem 文件。

cache_from

列表 / 元素=字符串

要考虑作为缓存源的镜像名称列表。

cli_context

字符串

要使用的 Docker CLI 上下文。

docker_host 互斥。

client_cert

别名:tls_client_cert, cert_path

路径

客户端的 TLS 证书文件的路径。

如果未在任务中指定该值且设置了环境变量 DOCKER_CERT_PATH,则将使用环境变量 DOCKER_CERT_PATH 中指定的目录中的 cert.pem 文件。

client_key

别名:tls_client_key, key_path

路径

客户端的 TLS 密钥文件的路径。

如果未在任务中指定该值且设置了环境变量 DOCKER_CERT_PATH,则将使用环境变量 DOCKER_CERT_PATH 中指定的目录中的 key.pem 文件。

docker_cli

路径

Docker CLI 的路径。如果未提供,将在 PATH 上搜索 Docker CLI。

docker_host

别名:docker_url

字符串

用于连接 Docker API 的 URL 或 Unix 套接字路径。要连接到远程主机,请提供 TCP 连接字符串。例如,tcp://192.0.2.23:2376。如果使用 TLS 加密连接,模块将自动将连接 URL 中的 tcp 替换为 https

如果任务中未指定该值,则将使用环境变量 DOCKER_HOST 的值。如果未设置环境变量,则将使用默认值。

cli_context 互斥。如果未提供 docker_hostcli_context,则使用值 unix:///var/run/docker.sock

dockerfile

字符串

提供构建镜像时要使用的 Dockerfile 的备用名称。

这还可以包括一个相对路径(相对于 path)。

etc_hosts

字典

在构建容器时添加到 /etc/hosts 的额外主机,作为主机名到 IP 地址的映射。

除了 IP 地址之外,还可以使用特殊值 host-gateway,它解析为主机的网关 IP,并允许构建容器连接到主机上运行的服务。

labels

字典

键值对字典。

name

字符串 / 必需

镜像名称。名称格式将为以下之一:namerepository/nameregistry_server:port/name。在推送或拉取镜像时,名称可以选择性地包含标签,方法是附加 :tag_name

请注意,不能使用镜像 ID(哈希值)和带有摘要的名称。

network

字符串

用于 RUN 构建指令的网络。

nocache

布尔值

构建镜像时不使用缓存。

选择

  • false ← (默认)

  • true

outputs

列表 / 元素=字典

在 community.docker 3.10.0 中添加

输出目标。

您可以提供一个导出器列表,以将构建的镜像导出到各个位置。请注意,并非所有导出器都可能受所使用的构建驱动程序支持。

请注意,根据此选项的使用方式,可能不会创建具有名称 name 和标签 tag 的镜像,这可能会导致此模块提供的基本幂等性不起作用。

为此选项提供一个空列表等同于完全不指定它。默认行为是具有 outputs[].type=image 的单个条目。

context

字符串

要将结果导入的 Docker 上下文的名称。

对于 outputs[].type=docker 是可选的。

dest

路径

目标路径。

对于 outputs[].type=localoutputs[].type=taroutputs[].type=oci 是必需的。

对于 outputs[].type=docker 是可选的。

name

字符串

存储镜像的名称。

如果未提供,则将使用 nametag

对于 outputs[].type=image 是可选的。

push

布尔值

是否将构建的镜像推送到注册表。

仅用于 outputs[].type=image

选择

  • false ← (默认)

  • true

type

字符串 / 必需

要使用的导出器类型。

选择

  • "docker":此导出类型将单平台结果镜像作为客户端上的 Docker 镜像规范 tarball 写入。此导出器创建的 tarball 也与 OCI 兼容。

    可以在 outputs[].dest 中提供目标。如果未指定,则 tarball 将自动加载到本地镜像存储中。

    可以在 outputs[].context 中提供要将结果导入的 Docker 上下文。

  • "image":此导出器将构建结果写入为镜像或清单列表。当使用此驱动程序时,该镜像将出现在 docker images 中。

    镜像名称可以在 outputs[].name 中提供。如果未提供,则将使用 nametag

    可以选择通过设置 outputs[].push=true 将镜像自动推送到注册表。

  • "local":此导出类型将所有结果文件写入客户端上的目录。新文件将由当前用户拥有。在多平台构建中,所有结果将按其平台放入子目录中。

    必须在 outputs[].dest 中提供目标。

  • "oci":此导出类型将结果镜像或清单列表作为客户端上的 OCI 镜像布局 tarball 写入。

    必须在 outputs[].dest 中提供目标。

  • "tar":此导出类型将所有结果文件作为客户端上的单个 tarball 写入。在多平台构建中,所有结果将按其平台放入子目录中。

    必须在 outputs[].dest 中提供目标。

路径

路径 / 必需

构建环境的路径。

platform

列表 / 元素=字符串

格式为 os[/arch[/variant]] 的平台。

自 community.docker 3.10.0 起,这可以是一个平台列表,而不仅仅是单个平台。

pull

布尔值

在构建镜像时,下载 Dockerfile 中 FROM 镜像的任何更新。

选择

  • false ← (默认)

  • true

rebuild

字符串

定义如果要构建的镜像(如 nametag 中指定)已存在时模块的行为。

选择

  • "never" ← (默认)

  • "always"

secrets

列表 / 元素=字典

在 community.docker 3.10.0 中添加

要暴露给构建的机密。

env

字符串

机密的环境值。

仅支持 secrets[].type=env 并且是必需的。

id

字符串 / 必需

机密标识符。

该机密将以文件形式在容器中的 /run/secrets/<id> 下提供。

src

路径

机密的源路径。

仅支持 secrets[].type=file 并且是必需的。

type

字符串 / 必需

机密的类型。

选择

  • "env":从目标上的环境变量读取机密。

    环境变量必须在 secrets[].env 中命名。

    请注意,这需要 Buildkit 插件的版本为 0.6.0 或更高。

  • "file":从目标上的文件中读取密钥。

    该文件必须在 secrets[].src 中指定。

  • "value":从给定的值 secrets[].value 中提供密钥。

    注意,密钥将作为环境变量传递给 docker compose。如果您认为这不够安全,请使用其他传输方式。

    请注意,这需要 Buildkit 插件的版本为 0.6.0 或更高。

value

字符串

密钥的值。

注意,密钥将作为环境变量传递给 docker compose。如果您认为这不够安全,请使用其他传输方式。

仅当 secrets[].type=value 时支持且必需。

shm_size

字符串

/dev/shm 的大小,格式为 <number>[<unit>]。Number 是正整数。Unit 可以是 B (字节)、 K (千字节,1024B)、 M (兆字节)、 G (吉字节)、 T (太字节) 或 P (拍字节)。

省略单位时,默认使用字节。如果完全省略大小,Docker 守护进程将使用 64M

tag

字符串

要标记的镜像名称 name 的标签。

如果 name 的格式为 name:tag,则 name 中的标签值将优先。

默认值: "latest"

target

字符串

在构建镜像时,通过名称指定一个中间构建阶段作为最终镜像的阶段。

tls

布尔值

通过使用 TLS 加密与 API 的连接,而不验证 Docker 主机服务器的真实性。请注意,如果 validate_certs 也设置为 true,它将优先。

如果在任务中未指定该值,则将使用环境变量 DOCKER_TLS 的值。如果未设置环境变量,则将使用默认值。

选择

  • false ← (默认)

  • true

tls_hostname

字符串

在验证 Docker 主机服务器的真实性时,提供服务器的预期名称。

如果在任务中未指定该值,则将使用环境变量 DOCKER_TLS_HOSTNAME 的值。如果未设置环境变量,则将使用默认值。

validate_certs

别名:tls_verify

布尔值

通过使用 TLS 并验证 Docker 主机服务器的真实性来保护与 API 的连接。

如果在任务中未指定该值,则将使用环境变量 DOCKER_TLS_VERIFY 的值。如果未设置环境变量,则将使用默认值。

选择

  • false ← (默认)

  • true

属性

属性

支持

描述

action_group

操作组: community.docker.dockerdocker

module_defaults 中使用 group/dockergroup/community.docker.docker 来为此模块设置默认值。

check_mode

支持:完整

可以在 check_mode 中运行并返回更改状态预测,而无需修改目标。

diff_mode

支持:

当处于 diff 模式时,将返回有关已更改(或可能需要在 check_mode 中更改)的详细信息。

注释

注意

另请参阅

另请参阅

community.docker.docker_image_push

将 Docker 镜像推送到注册表。

community.docker.docker_image_tag

使用新名称和/或标签标记 Docker 镜像。

示例

- name: Build Python 3.12 image
  community.docker.docker_image_build:
    name: localhost/python/3.12:latest
    path: /home/user/images/python
    dockerfile: Dockerfile-3.12

- name: Build multi-platform image
  community.docker.docker_image_build:
    name: multi-platform-image
    tag: "1.5.2"
    path: /home/user/images/multi-platform
    platform:
      - linux/amd64
      - linux/arm64/v8

返回值

常见的返回值记录在 此处,以下是此模块特有的字段

描述

image

字典

受影响镜像的镜像检查结果。

返回: 成功

示例: {}

作者

  • Felix Fontein (@felixfontein)