打包 OCI 镜像

该插件可以使用 Cloud Native Buildpacks (CNB) 从 jar 或 war 文件创建 OCI 镜像。可以使用 build-image 目标在命令行上构建镜像。这确保了在创建镜像之前,包的生命周期已经运行。

出于安全原因,镜像以非 root 用户身份构建和运行。有关详细信息,请参阅 CNB 规范

最简单的入门方法是在项目上调用 mvn spring-boot:build-image。可以自动创建镜像,只要调用 package 阶段,如下例所示

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<executions>
				<execution>
					<goals>
						<goal>build-image-no-fork</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>
将目标绑定到包生命周期时使用 build-image-no-fork。此目标类似于 build-image,但不会分叉生命周期以确保 package 已运行。在本节的其余部分,build-image 用于指代 build-imagebuild-image-no-fork 目标。
虽然构建包从 可执行归档 运行,但没有必要首先执行 repackage 目标,因为可执行归档在必要时会自动创建。当 build-image 重新打包应用程序时,它会应用与 repackage 目标相同的设置,即可以使用其中一个排除选项排除依赖项。spring-boot-devtoolsspring-boot-docker-compose 模块默认自动排除(您可以使用 excludeDevtoolsexcludeDockerCompose 属性控制此行为)。

Docker Daemon

build-image 目标需要访问 Docker daemon。该目标将检查本地 Docker CLI 配置文件 以确定当前的 上下文,并使用上下文连接信息与 Docker daemon 通信。如果无法确定当前上下文或上下文没有连接信息,则该目标将使用默认的本地连接。这适用于所有受支持平台上的 Docker Engine,无需配置。

可以设置环境变量来配置 build-image 目标以使用替代的本地或远程连接。下表显示了环境变量及其值

环境变量 描述

DOCKER_CONFIG

用于确定当前上下文的 Docker CLI 配置文件 的位置(默认为 $HOME/.docker

DOCKER_CONTEXT

应从 Docker CLI 配置文件中检索主机信息的 上下文 名称(覆盖 DOCKER_HOST

DOCKER_HOST

包含 Docker daemon 主机和端口的 URL - 例如 tcp://192.168.99.100:2376

DOCKER_TLS_VERIFY

设置为 1 时启用安全的 HTTPS 协议(可选)

DOCKER_CERT_PATH

HTTPS 证书和密钥文件的路径(如果 DOCKER_TLS_VERIFY=1,则必需,否则忽略)

Docker daemon 连接信息也可以通过插件配置中的 docker 参数提供。下表总结了可用参数

参数 描述

context

应从 Docker CLI 配置文件 中检索主机信息的 上下文 名称

host

包含 Docker daemon 主机和端口的 URL - 例如 tcp://192.168.99.100:2376

tlsVerify

设置为 true 时启用安全的 HTTPS 协议(可选)

certPath

HTTPS 证书和密钥文件的路径(如果 tlsVerifytrue,则必需,否则忽略)

bindHostToBuilder

true 时,host 属性的值将提供给为 CNB 构建器创建的容器(可选)

有关更多详细信息,另请参阅 示例

Docker Registry

如果 builderrunImage 参数指定的 Docker 镜像存储在需要身份验证的私有 Docker 镜像仓库中,则可以使用 docker.builderRegistry 参数提供身份验证凭据。

如果生成的 Docker 镜像要发布到 Docker 镜像仓库,则可以使用 docker.publishRegistry 参数提供身份验证凭据。

参数用于用户身份验证或身份令牌身份验证。请查阅所用 Docker 仓库的文档,以获取有关支持的身份验证方法的更多信息。

下表总结了 docker.builderRegistrydocker.publishRegistry 的可用参数

参数 描述

username

Docker 镜像仓库用户的用户名。用户身份验证必需。

password

Docker 镜像仓库用户的密码。用户身份验证必需。

url

Docker 镜像仓库的地址。用户身份验证可选。

email

Docker 镜像仓库用户的电子邮件地址。用户身份验证可选。

token

Docker 镜像仓库用户的身份令牌。令牌身份验证必需。

有关更多详细信息,另请参阅 示例

如果未提供凭据,插件将读取用户的现有 Docker 配置文件(通常位于 $HOME/.docker/config.json)以确定身份验证方法。使用这些方法,插件尝试为请求的镜像提供身份验证凭据。

该插件支持以下身份验证方法

  • 凭据助手:Docker 配置文件中配置的外部工具,用于为特定仓库提供凭据。例如,像 osxkeychainecr-login 这样的工具处理某些仓库的身份验证。

  • 凭据存储:一种默认的后备机制,用于安全地存储和检索凭据(例如,Docker Desktop 的 desktop)。

  • 静态凭据:直接存储在 Docker 配置文件 auths 部分下的凭据。

镜像自定义

插件调用 构建器 来协调镜像的生成。构建器包含多个 构建包,可以检查应用程序以影响生成的镜像。默认情况下,插件选择一个构建器镜像。生成的镜像名称从项目属性中推断。

image 参数允许配置构建器及其应如何操作项目。下表总结了可用参数及其默认值

参数 / (用户属性) 描述 默认值

builder
(spring-boot.build-image.builder)

要使用的构建器镜像的名称。

paketobuildpacks/builder-noble-java-tiny:latest

trustBuilder
(spring-boot.build-image.trustBuilder)

是否将构建器视为 受信任的

如果构建器是 paketobuildpacks/builder-noble-java-tinypaketobuildpacks/builder-jammy-java-tinypaketobuildpacks/builder-jammy-tinypaketobuildpacks/builder-jammy-basepaketobuildpacks/builder-jammy-fullpaketobuildpacks/builder-jammy-buildpackless-tinypaketobuildpacks/builder-jammy-buildpackless-basepaketobuildpacks/builder-jammy-buildpackless-fullgcr.io/buildpacks/builderheroku/builder 中的一个,则为 true;否则为 false

imagePlatform
(spring-boot.build-image.imagePlatform)

拉取的任何构建器、运行和构建包镜像的平台(操作系统和架构)。必须采用 OS[/architecture[/variant]] 的形式,例如 linux/amd64linux/arm64linux/arm/v5。请参阅所用构建器的文档以确定可用的镜像 OS 和架构选项。

无默认值,表示应使用主机机器的平台。

runImage
(spring-boot.build-image.runImage)

要使用的运行镜像的名称。

无默认值,表示应使用 Builder 元数据中指定的运行镜像。

name
(spring-boot.build-image.imageName)

生成的镜像的 镜像名称

docker.io/library/
${project.artifactId}:${project.version}

pullPolicy
(spring-boot.build-image.pullPolicy)

用于确定何时从仓库拉取构建器和运行镜像的 策略。可接受的值为 ALWAYSNEVERIF_NOT_PRESENT

ALWAYS

env

应传递给构建器的环境变量。

buildpacks

构建器在构建镜像时应使用的构建包。只使用指定的构建包,覆盖构建器中包含的默认构建包。构建包引用必须采用以下形式之一

  • 构建器中的构建包 - [urn:cnb:builder:]<buildpack ID>[@<version>]

  • 文件系统上目录中的构建包 - [file://]<path>

  • 文件系统上 gzipped tar (.tgz) 文件中的构建包 - [file://]<path>/<file name>

  • OCI 镜像中的构建包 - [docker://]<host>/<repo>[:<tag>][@<digest>]

无,表示构建器应使用其中包含的构建包。

bindings

构建镜像时应挂载到构建器容器的 卷绑定挂载。在创建构建器容器时,绑定将未经解析和验证地传递给 Docker。绑定必须采用以下形式之一

  • <主机源路径>:<容器目标路径>[:<选项>]

  • <主机卷名称>:<容器目标路径>[:<选项>]

其中 <options> 可以包含

  • ro 将卷挂载为容器中的只读

  • rw 将卷挂载为容器中的可读写

  • volume-opt=key=value 指定由选项名称及其值组成的键值对

network + (spring-boot.build-image.network)

构建器容器将配置使用的 网络驱动程序。提供的值在创建构建器容器时未经验证地传递给 Docker。

cleanCache + (spring-boot.build-image.cleanCache)

是否在构建前清理缓存。

verboseLogging

启用构建器操作的详细日志记录。

publish + (spring-boot.build-image.publish)

是否将生成的镜像发布到 Docker 仓库。

tags

要应用于生成的镜像的一个或多个附加标签。提供给 tags 选项的值应为完整的镜像引用。有关更多详细信息,请参阅 标签部分

buildWorkspace

构建器和构建包在镜像构建过程中存储文件的临时工作区。该值可以是命名卷或绑定挂载位置。

Docker daemon 中的命名卷,其名称源自镜像名称。

buildCache

包含构建包创建并由镜像构建过程使用的层的缓存。该值可以是命名卷或绑定挂载位置。

Docker daemon 中的命名卷,其名称源自镜像名称。

launchCache

包含构建包创建并由镜像启动过程使用的层的缓存。该值可以是命名卷或绑定挂载位置。

Docker daemon 中的命名卷,其名称源自镜像名称。

createdDate
(spring-boot.build-image.createdDate)

将用于设置生成镜像元数据中 Created 字段的日期。该值必须是 ISO 8601 瞬时格式的字符串,或者 now 用于使用当前日期和时间。

固定日期,启用 构建可重现性

applicationDirectory
(spring-boot.build-image.applicationDirectory)

应用程序内容将上传到构建器镜像中的目录路径。应用程序内容也将在生成的镜像中的此位置。

/workspace

securityOptions

将应用于构建器容器的 安全选项,以字符串值数组的形式提供

Linux 和 macOS 上为 ["label=disable"],Windows 上为 []

插件使用编译器的插件配置或 maven.compiler.target 属性检测项目的目标 Java 兼容性。当使用默认的 Paketo 构建器和构建包时,插件会指示构建包安装相同的 Java 版本。您可以根据 构建器配置 示例所示覆盖此行为。

有关更多详细信息,另请参阅 示例

标签格式

提供给 tags 选项的值应为完整的镜像引用。接受的格式为 [domainHost:port/][path/]name[:tag][@digest]

如果缺少域,则默认为 docker.io。如果缺少路径,则默认为 library。如果缺少标签,则默认为 latest

一些示例

  • my-image 导致镜像引用 docker.io/library/my-image:latest

  • my-repository/my-image 导致 docker.io/my-repository/my-image:latest

  • example.com/my-repository/my-image:1.0.0 将按原样使用

spring-boot:build-image

org.springframework.boot:spring-boot-maven-plugin:4.0.0

使用构建包将应用程序打包成 OCI 镜像,分叉生命周期以确保 package 已运行。此目标适用于命令行调用。如果您需要在构建中配置目标 execution,请改用 build-image-no-fork

必需参数

名称 类型 默认值

sourceDirectory

文件

${project.build.directory}

可选参数

名称 类型 默认值

applicationDirectory

字符串

classifier

字符串

cleanCache

布尔值

createdDate

字符串

docker

Docker

excludeDevtools

布尔值

true

excludeDockerCompose

布尔值

true

excludeGroupIds

字符串

excludes

List

image

Image

imageBuilder

字符串

imageName

字符串

imagePlatform

字符串

includeOptional

布尔值

includeSystemScope

布尔值

includeTools

布尔值

true

includes

List

layers

Layers

layout

LayoutType

layoutFactory

LayoutFactory

mainClass

字符串

network

字符串

publish

布尔值

pullPolicy

PullPolicy

runImage

字符串

skip

布尔值

trustBuilder

布尔值

参数详情

applicationDirectory

Image#applicationDirectory 的别名,用于支持通过命令行属性进行配置。

名称

applicationDirectory

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.applicationDirectory

3.1.0

classifier

查找源归档时使用的分类器。

名称

classifier

类型

java.lang.String

默认值

用户属性

2.3.0

cleanCache

Image#cleanCache 的别名,用于支持通过命令行属性进行配置。

名称

cleanCache

类型

java.lang.Boolean

默认值

用户属性

spring-boot.build-image.cleanCache

2.4.0

createdDate

Image#createdDate 的别名,用于支持通过命令行属性进行配置。

名称

createdDate

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.createdDate

3.1.0

docker

Docker 配置选项。

名称

docker

类型

org.springframework.boot.maven.Docker

默认值

用户属性

2.4.0

excludeDevtools

从重新打包的归档中排除 Spring Boot devtools。

名称

excludeDevtools

类型

布尔值

默认值

true

用户属性

spring-boot.repackage.excludeDevtools

1.3.0

excludeDockerCompose

从重新打包的归档中排除 Spring Boot 开发服务。

名称

excludeDockerCompose

类型

布尔值

默认值

true

用户属性

spring-boot.repackage.excludeDockerCompose

3.1.0

excludeGroupIds

要排除的 groupId 名称的逗号分隔列表(精确匹配)。

名称

excludeGroupIds

类型

java.lang.String

默认值

用户属性

spring-boot.excludeGroupIds

1.1.0

excludes

要排除的 artifact 定义集合。Exclude 元素定义了强制的 groupIdartifactId 组件以及可选的 classifier 组件。当配置为属性时,值应以逗号分隔,组件以冒号分隔:groupId:artifactId,groupId:artifactId:classifier

名称

excludes

类型

java.util.List

默认值

用户属性

spring-boot.excludes

1.1.0

image

镜像配置,包含 builderrunImagenameenvcleanCacheverboseLoggingpullPolicypublish 选项。

名称

image

类型

org.springframework.boot.maven.Image

默认值

用户属性

2.3.0

imageBuilder

Image#builder 的别名,用于支持通过命令行属性进行配置。

名称

imageBuilder

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.builder

2.3.0

imageName

Image#name 的别名,用于支持通过命令行属性进行配置。

名称

imageName

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.imageName

2.3.0

imagePlatform

Image#imagePlatform 的别名,用于支持通过命令行属性进行配置。

名称

imagePlatform

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.imagePlatform

3.4.0

includeOptional

包含可选依赖项。

名称

includeOptional

类型

布尔值

默认值

用户属性

3.5.7

includeSystemScope

包含系统范围依赖项。

名称

includeSystemScope

类型

布尔值

默认值

用户属性

1.4.0

includeTools

包含 JAR 工具。

名称

includeTools

类型

布尔值

默认值

true

用户属性

3.3.0

includes

要包含的 artifact 定义集合。Include 元素定义了强制的 groupIdartifactId 组件以及可选的 classifier 组件。当配置为属性时,值应以逗号分隔,组件以冒号分隔:groupId:artifactId,groupId:artifactId:classifier

名称

includes

类型

java.util.List

默认值

用户属性

spring-boot.includes

1.2.0

layers

层配置,包含禁用层创建、排除层工具 jar 和提供自定义层配置文件的选项。

名称

layers

类型

org.springframework.boot.maven.Layers

默认值

用户属性

2.3.0

layout

归档类型(对应于依赖项在其中布局的方式)。可能的值为 JARWARZIPDIRNONE。默认为根据归档类型猜测。

名称

layout

类型

org.springframework.boot.maven.AbstractPackagerMojo$LayoutType

默认值

用户属性

2.3.11

layoutFactory

如果未设置显式布局,将用于创建可执行归档的布局工厂。第三方可以提供替代布局实现。

名称

layoutFactory

类型

org.springframework.boot.loader.tools.LayoutFactory

默认值

用户属性

2.3.11

mainClass

主类的名称。如果未指定,则将使用找到的第一个包含 main 方法的已编译类。

名称

mainClass

类型

java.lang.String

默认值

用户属性

1.0.0

network

Image#network 的别名,用于支持通过命令行属性进行配置。

名称

network

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.network

2.6.0

publish

Image#publish 的别名,用于支持通过命令行属性进行配置。

名称

publish

类型

java.lang.Boolean

默认值

用户属性

spring-boot.build-image.publish

pullPolicy

Image#pullPolicy 的别名,用于支持通过命令行属性进行配置。

名称

pullPolicy

类型

org.springframework.boot.buildpack.platform.build.PullPolicy

默认值

用户属性

spring-boot.build-image.pullPolicy

runImage

Image#runImage 的别名,用于支持通过命令行属性进行配置。

名称

runImage

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.runImage

2.3.1

skip

跳过执行。

名称

skip

类型

布尔值

默认值

用户属性

spring-boot.build-image.skip

2.3.0

sourceDirectory

包含源归档的目录。

名称

sourceDirectory

类型

java.io.File

默认值

${project.build.directory}

用户属性

2.3.0

trustBuilder

Image#trustBuilder 的别名,用于支持通过命令行属性进行配置。

名称

trustBuilder

类型

java.lang.Boolean

默认值

用户属性

spring-boot.build-image.trustBuilder

spring-boot:build-image-no-fork

org.springframework.boot:spring-boot-maven-plugin:4.0.0

使用构建包将应用程序打包成 OCI 镜像,但不分叉生命周期。在构建中配置目标 execution 时应使用此目标。要在命令行上调用此目标,请改用 build-image

必需参数

名称 类型 默认值

sourceDirectory

文件

${project.build.directory}

可选参数

名称 类型 默认值

applicationDirectory

字符串

classifier

字符串

cleanCache

布尔值

createdDate

字符串

docker

Docker

excludeDevtools

布尔值

true

excludeDockerCompose

布尔值

true

excludeGroupIds

字符串

excludes

List

image

Image

imageBuilder

字符串

imageName

字符串

imagePlatform

字符串

includeOptional

布尔值

includeSystemScope

布尔值

includeTools

布尔值

true

includes

List

layers

Layers

layout

LayoutType

layoutFactory

LayoutFactory

mainClass

字符串

network

字符串

publish

布尔值

pullPolicy

PullPolicy

runImage

字符串

skip

布尔值

trustBuilder

布尔值

参数详情

applicationDirectory

Image#applicationDirectory 的别名,用于支持通过命令行属性进行配置。

名称

applicationDirectory

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.applicationDirectory

3.1.0

classifier

查找源归档时使用的分类器。

名称

classifier

类型

java.lang.String

默认值

用户属性

2.3.0

cleanCache

Image#cleanCache 的别名,用于支持通过命令行属性进行配置。

名称

cleanCache

类型

java.lang.Boolean

默认值

用户属性

spring-boot.build-image.cleanCache

2.4.0

createdDate

Image#createdDate 的别名,用于支持通过命令行属性进行配置。

名称

createdDate

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.createdDate

3.1.0

docker

Docker 配置选项。

名称

docker

类型

org.springframework.boot.maven.Docker

默认值

用户属性

2.4.0

excludeDevtools

从重新打包的归档中排除 Spring Boot devtools。

名称

excludeDevtools

类型

布尔值

默认值

true

用户属性

spring-boot.repackage.excludeDevtools

1.3.0

excludeDockerCompose

从重新打包的归档中排除 Spring Boot 开发服务。

名称

excludeDockerCompose

类型

布尔值

默认值

true

用户属性

spring-boot.repackage.excludeDockerCompose

3.1.0

excludeGroupIds

要排除的 groupId 名称的逗号分隔列表(精确匹配)。

名称

excludeGroupIds

类型

java.lang.String

默认值

用户属性

spring-boot.excludeGroupIds

1.1.0

excludes

要排除的 artifact 定义集合。Exclude 元素定义了强制的 groupIdartifactId 组件以及可选的 classifier 组件。当配置为属性时,值应以逗号分隔,组件以冒号分隔:groupId:artifactId,groupId:artifactId:classifier

名称

excludes

类型

java.util.List

默认值

用户属性

spring-boot.excludes

1.1.0

image

镜像配置,包含 builderrunImagenameenvcleanCacheverboseLoggingpullPolicypublish 选项。

名称

image

类型

org.springframework.boot.maven.Image

默认值

用户属性

2.3.0

imageBuilder

Image#builder 的别名,用于支持通过命令行属性进行配置。

名称

imageBuilder

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.builder

2.3.0

imageName

Image#name 的别名,用于支持通过命令行属性进行配置。

名称

imageName

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.imageName

2.3.0

imagePlatform

Image#imagePlatform 的别名,用于支持通过命令行属性进行配置。

名称

imagePlatform

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.imagePlatform

3.4.0

includeOptional

包含可选依赖项。

名称

includeOptional

类型

布尔值

默认值

用户属性

3.5.7

includeSystemScope

包含系统范围依赖项。

名称

includeSystemScope

类型

布尔值

默认值

用户属性

1.4.0

includeTools

包含 JAR 工具。

名称

includeTools

类型

布尔值

默认值

true

用户属性

3.3.0

includes

要包含的 artifact 定义集合。Include 元素定义了强制的 groupIdartifactId 组件以及可选的 classifier 组件。当配置为属性时,值应以逗号分隔,组件以冒号分隔:groupId:artifactId,groupId:artifactId:classifier

名称

includes

类型

java.util.List

默认值

用户属性

spring-boot.includes

1.2.0

layers

层配置,包含禁用层创建、排除层工具 jar 和提供自定义层配置文件的选项。

名称

layers

类型

org.springframework.boot.maven.Layers

默认值

用户属性

2.3.0

layout

归档类型(对应于依赖项在其中布局的方式)。可能的值为 JARWARZIPDIRNONE。默认为根据归档类型猜测。

名称

layout

类型

org.springframework.boot.maven.AbstractPackagerMojo$LayoutType

默认值

用户属性

2.3.11

layoutFactory

如果未设置显式布局,将用于创建可执行归档的布局工厂。第三方可以提供替代布局实现。

名称

layoutFactory

类型

org.springframework.boot.loader.tools.LayoutFactory

默认值

用户属性

2.3.11

mainClass

主类的名称。如果未指定,则将使用找到的第一个包含 main 方法的已编译类。

名称

mainClass

类型

java.lang.String

默认值

用户属性

1.0.0

network

Image#network 的别名,用于支持通过命令行属性进行配置。

名称

network

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.network

2.6.0

publish

Image#publish 的别名,用于支持通过命令行属性进行配置。

名称

publish

类型

java.lang.Boolean

默认值

用户属性

spring-boot.build-image.publish

pullPolicy

Image#pullPolicy 的别名,用于支持通过命令行属性进行配置。

名称

pullPolicy

类型

org.springframework.boot.buildpack.platform.build.PullPolicy

默认值

用户属性

spring-boot.build-image.pullPolicy

runImage

Image#runImage 的别名,用于支持通过命令行属性进行配置。

名称

runImage

类型

java.lang.String

默认值

用户属性

spring-boot.build-image.runImage

2.3.1

skip

跳过执行。

名称

skip

类型

布尔值

默认值

用户属性

spring-boot.build-image.skip

2.3.0

sourceDirectory

包含源归档的目录。

名称

sourceDirectory

类型

java.io.File

默认值

${project.build.directory}

用户属性

2.3.0

trustBuilder

Image#trustBuilder 的别名,用于支持通过命令行属性进行配置。

名称

trustBuilder

类型

java.lang.Boolean

默认值

用户属性

spring-boot.build-image.trustBuilder

示例

自定义镜像构建器

如果您需要自定义用于创建镜像的构建器或用于启动已构建镜像的运行镜像,请按以下示例配置插件

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<image>
						<builder>mine/java-cnb-builder</builder>
						<runImage>mine/java-cnb-run</runImage>
					</image>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

此配置将使用名为 mine/java-cnb-builder 且标签为 latest 的构建器镜像,以及名为 mine/java-cnb-run 且标签为 latest 的运行镜像。

构建器和运行镜像也可以在命令行上指定,如下例所示

$ mvn spring-boot:build-image -Dspring-boot.build-image.builder=mine/java-cnb-builder -Dspring-boot.build-image.runImage=mine/java-cnb-run

构建器配置

如果构建器使用环境变量暴露配置选项,则可以使用 env 属性设置这些选项。

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<image>
						<env>
							<BP_JVM_VERSION>17</BP_JVM_VERSION>
						</env>
					</image>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

如果 Docker daemon 运行的构建器与构建包下载工件的网络位置之间存在网络代理,则需要配置构建器使用该代理。当使用 Paketo 构建器时,可以通过设置 HTTPS_PROXY 和/或 HTTP_PROXY 环境变量来完成,如下例所示

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<image>
						<env>
							<HTTP_PROXY>http://proxy.example.com</HTTP_PROXY>
							<HTTPS_PROXY>https://proxy.example.com</HTTPS_PROXY>
						</env>
					</image>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

运行时 JVM 配置

Paketo Java 构建包通过设置 JAVA_TOOL_OPTIONS 环境变量 配置 JVM 运行时环境。可以修改构建包提供的 JAVA_TOOL_OPTIONS 值,以在应用程序镜像在容器中启动时自定义 JVM 运行时行为。

应存储在镜像中并应用于每次部署的环境变量修改可以按照 Paketo 文档 中所述设置,如下例所示

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<image>
						<env>
							<BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS>
							<BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:+HeapDumpOnOutOfMemoryError</BPE_APPEND_JAVA_TOOL_OPTIONS>
						</env>
					</image>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

自定义镜像名称

默认情况下,镜像名称是根据项目的 artifactIdversion 推断出来的,例如 docker.io/library/${project.artifactId}:${project.version}。您可以控制名称,如下例所示

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<image>
						<name>example.com/library/${project.artifactId}</name>
					</image>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
此配置未提供显式标签,因此使用 latest。也可以指定标签,可以使用 ${project.version}、构建中可用的任何属性或硬编码版本。

镜像名称也可以在命令行上指定,如下例所示

$ mvn spring-boot:build-image -Dspring-boot.build-image.imageName=example.com/library/my-app:v1

构建包

默认情况下,构建器将使用构建器镜像中包含的构建包并按预定义顺序应用它们。可以提供一组替代的构建包,以应用未包含在构建器中的构建包,或更改包含的构建包的顺序。当提供一个或多个构建包时,只应用指定的构建包。

以下示例指示构建器使用打包在 .tgz 文件中的自定义构建包,然后是构建器中包含的构建包。

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<image>
						<buildpacks>
							<buildpack>file:///path/to/example-buildpack.tgz</buildpack>
							<buildpack>urn:cnb:builder:paketo-buildpacks/java</buildpack>
						</buildpacks>
					</image>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

构建包可以按以下任何一种形式指定。

CNB 构建器中的构建包(如果构建器中只有一个与 buildpack-id 匹配的构建包,则可以省略版本)

包含构建包内容的目录路径(Windows 上不支持)

  • file:///path/to/buildpack/

  • /path/to/buildpack/

包含构建包内容的 gzipped tar 文件的路径

  • file:///path/to/buildpack.tgz

  • /path/to/buildpack.tgz

包含 打包构建包 的 OCI 镜像

  • docker://example/buildpack

  • docker:///example/buildpack:latest

  • docker:///example/buildpack@sha256:45b23dee08…​

  • example/buildpack

  • example/buildpack:latest

  • example/buildpack@sha256:45b23dee08…​

镜像发布

可以通过启用 publish 选项将生成的镜像发布到 Docker 仓库。

如果 Docker 仓库需要身份验证,可以使用 docker.publishRegistry 参数配置凭据。如果 Docker 仓库不需要身份验证,则可以省略 docker.publishRegistry 配置。

镜像将发布到的仓库由镜像名称的仓库部分决定(在这些示例中为 docker.example.com)。如果配置了 docker.publishRegistry 凭据并包含 url 参数,则此值将传递给仓库,但不用于确定发布仓库位置。
<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<image>
						<name>docker.example.com/library/${project.artifactId}</name>
						<publish>true</publish>
					</image>
					<docker>
						<publishRegistry>
							<username>user</username>
							<password>secret</password>
						</publishRegistry>
					</docker>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

publish 选项也可以在命令行上指定,如下例所示

$ mvn spring-boot:build-image -Dspring-boot.build-image.imageName=docker.example.com/library/my-app:v1 -Dspring-boot.build-image.publish=true

当在命令行上使用 publish 选项并进行身份验证时,您可以像此示例中一样使用属性提供凭据

$ mvn spring-boot:build-image \
      -Ddocker.publishRegistry.username=user \
      -Ddocker.publishRegistry.password=secret \
      -Ddocker.publishRegistry.url=docker.example.com \
      -Dspring-boot.build-image.publish=true \
      -Dspring-boot.build-image.imageName=docker.example.com/library/my-app:v1

并在 XML 配置中引用属性

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<docker>
						<publishRegistry>
							<url>${docker.publishRegistry.url}</url>
							<username>${docker.publishRegistry.username}</username>
							<password>${docker.publishRegistry.password}</password>
						</publishRegistry>
					</docker>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

构建器缓存和工作区配置

CNB 构建器缓存用于构建和启动镜像的层。默认情况下,这些缓存作为命名卷存储在 Docker daemon 中,其名称源自目标镜像的完整名称。如果镜像名称频繁更改,例如当项目版本用作镜像名称中的标签时,缓存可能会频繁失效。

可以配置缓存卷使用替代名称,以更好地控制缓存生命周期,如下例所示

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<image>
						<buildCache>
							<volume>
								<name>cache-${project.artifactId}.build</name>
							</volume>
						</buildCache>
						<launchCache>
							<volume>
								<name>cache-${project.artifactId}.launch</name>
							</volume>
						</launchCache>
					</image>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

构建器和构建包在镜像构建过程中需要一个位置来存储临时文件。默认情况下,此临时构建工作区存储在命名卷中。

可以配置缓存和构建工作区使用绑定挂载而不是命名卷,如下例所示

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<image>
						<buildWorkspace>
							<bind>
								<source>/tmp/cache-${project.artifactId}.work</source>
							</bind>
						</buildWorkspace>
						<buildCache>
							<bind>
								<source>/tmp/cache-${project.artifactId}.build</source>
							</bind>
						</buildCache>
						<launchCache>
							<bind>
								<source>/tmp/cache-${project.artifactId}.launch</source>
							</bind>
						</launchCache>
					</image>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Docker 配置

minikube 的 Docker 配置

插件可以与 minikube 提供的 Docker daemon 通信,而不是默认的本地连接。

在 Linux 和 macOS 上,minikube 启动后可以使用命令 eval $(minikube docker-env) 设置环境变量。

也可以通过提供类似于以下示例中所示的连接详细信息来配置插件使用 minikube daemon

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<docker>
						<host>tcp://192.168.99.100:2376</host>
						<tlsVerify>true</tlsVerify>
						<certPath>/home/user/.minikube/certs</certPath>
					</docker>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

podman 的 Docker 配置

插件可以与 podman 容器引擎 通信。

可以通过提供类似于以下示例中所示的连接详细信息来配置插件使用 podman 本地连接

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<docker>
						<host>unix:///run/user/1000/podman/podman.sock</host>
						<bindHostToBuilder>true</bindHostToBuilder>
					</docker>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
安装 colima CLI 后,可以使用命令 podman info --format='{{.Host.RemoteSocket.Path}}' 获取此示例中所示的 docker.host 配置属性的值。

Colima 的 Docker 配置

插件可以与 Colima 提供的 Docker daemon 通信。可以使用以下命令设置 DOCKER_HOST 环境变量

$ export DOCKER_HOST=$(docker context inspect colima -f '{{.Endpoints.docker.Host}}')

也可以通过提供类似于以下示例中所示的连接详细信息来配置插件使用 Colima daemon

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<docker>
						<host>unix:///${user.home}/.colima/docker.sock</host>
					</docker>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Docker 身份验证配置

如果构建器或运行镜像存储在支持用户身份验证的私有 Docker 仓库中,则可以使用 docker.builderRegistry 参数提供身份验证详细信息,如下例所示

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<docker>
						<builderRegistry>
							<username>user</username>
							<password>secret</password>
							<url>https://docker.example.com/v1/</url>
							<email>[email protected]</email>
						</builderRegistry>
					</docker>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

如果构建器或运行镜像存储在支持令牌身份验证的私有 Docker 仓库中,则可以使用 docker.builderRegistry 参数提供令牌值,如下例所示

<project>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<docker>
						<builderRegistry>
							<token>9cbaf023786cd7...</token>
						</builderRegistry>
					</docker>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
© . This site is unofficial and not affiliated with VMware.