|
对于最新稳定版本,请使用 Spring Boot 4.0.4! |
打包 OCI 镜像
| 出于安全考虑,镜像以非 root 用户身份构建和运行。 更多详情请参见 CNB 规范。 |
当应用了 java 或 war 插件时,该任务会自动创建,并且是 BootBuildImage 的一个实例。
Docker 守护进程
bootBuildImage 任务需要访问 Docker 守护进程。
该任务将检查本地 Docker CLI 配置文件,以确定当前的 上下文,并使用该上下文的连接信息与 Docker 守护进程通信。
如果无法确定当前上下文,或者该上下文不包含连接信息,则该任务将使用默认的本地连接。
这种方式在所有受支持的平台上无需额外配置即可与 Docker Engine 配合使用。
可以设置环境变量来配置 bootBuildImage 任务,以使用替代的本地或远程连接。
下表列出了环境变量及其对应的值:
| 环境变量 | <description> </description> |
|---|---|
DOCKER_CONFIG |
用于确定当前上下文的 Docker CLI 配置文件 所在位置(默认为 |
DOCKER_CONTEXT |
用于从 Docker CLI 配置文件中检索主机信息的上下文名称(会覆盖 |
DOCKER_HOST |
包含 Docker 守护进程主机和端口的 URL —— 例如 |
DOCKER_TLS_VERIFY |
当设置为 |
DOCKER_CERT_PATH |
用于 HTTPS 的证书和密钥文件路径(当 |
也可以在插件配置中使用 docker 属性来提供 Docker 守护进程的连接信息。
下表汇总了可用的属性:
| <property> </property> | <description> </description> |
|---|---|
|
|
|
包含 Docker 守护进程主机和端口的 URL —— 例如 |
|
当设置为 |
|
用于 HTTPS 的证书和密钥文件的路径(如果 |
|
当值为 |
有关更多详细信息,请参阅示例。
Docker 注册表
如果 builder 或 runImage 属性所指定的 Docker 镜像存储在需要身份验证的私有 Docker 镜像仓库中,则可以使用 docker.builderRegistry 属性提供身份验证凭据。
如果要将生成的 Docker 镜像发布到 Docker 镜像仓库,可以使用 docker.publishRegistry 属性提供身份验证凭据。
提供了用于用户身份验证或身份Tokens身份验证的属性。 有关所支持的身份验证方法的更多信息,请参阅所使用的 Docker 注册表的文档,该注册表用于存储镜像。
下表汇总了 docker.builderRegistry 和 docker.publishRegistry 可用的属性:
| <property> </property> | <description> </description> |
|---|---|
|
Docker 镜像仓库用户的用户名。用于用户身份验证,为必填项。 |
|
Docker 镜像仓库用户的密码。用于用户身份验证,为必填项。 |
|
Docker 镜像仓库的地址。用户认证时为可选项。 |
|
Docker 镜像仓库用户的电子邮件地址。用于用户认证,可选。 |
|
Docker 镜像仓库用户的身份Tokens。Tokens认证所必需。 |
有关更多详细信息,请参阅示例。
|
如果未提供凭据,该插件会读取用户现有的 Docker 配置文件(通常位于 该插件支持以下认证方法:
|
图像自定义
该插件调用一个构建器(builder)来协调镜像的生成。 该构建器包含多个构建包(buildpacks),可以检查应用程序以影响所生成的镜像。 默认情况下,该插件会选择一个构建器镜像。 所生成镜像的名称由项目属性推断得出。
任务属性可用于配置构建器应如何在项目上操作。 下表汇总了可用的属性及其默认值:
| <property> </property> | 命令行选项 | <description> </description> | 默认值 |
|---|---|---|---|
|
|
要使用的构建器镜像的名称。 |
|
|
|
是否将构建器视为可信。 |
|
|
|
所拉取的任何构建器(builder)、运行(run)和构建包(buildpack)镜像的平台(操作系统和架构)。
必须采用 |
无默认值,表示应使用主机机器的平台。 |
|
|
要使用的运行镜像的名称。 |
无默认值,表示应使用构建器元数据中指定的运行时镜像。 |
|
|
生成图像的图像名称。 |
|
|
|
策略,用于确定何时从注册表拉取构建器镜像和运行镜像。
可接受的值为 |
|
|
应传递给构建器的环境变量。 |
Empty. |
|
|
构建器在构建镜像时应使用的构建包(Buildpacks)。 仅会使用指定的构建包,覆盖构建器中包含的默认构建包。 构建包引用必须采用以下形式之一:
|
无,表示构建器应使用其内置的构建包。 |
|
|
构建镜像时应挂载到构建器容器的卷绑定挂载(Volume bind mounts)。 创建构建器容器时,这些绑定将不经解析和验证直接传递给 Docker。 绑定必须采用以下形式之一:
其中
|
||
|
|
构建器容器将配置为使用的网络驱动程序。 所提供的值在创建构建器容器时将未经验证地传递给 Docker。 |
|
|
|
是否在构建之前清理缓存。 |
|
|
启用构建器操作的详细日志记录。 |
|
|
|
|
是否将生成的镜像发布到 Docker 仓库。 |
|
|
一个或多个要应用于生成镜像的附加标签列表。
提供给 |
||
|
一个临时工作区,构建器和构建包将在镜像构建过程中使用它来存储文件。 该值可以是一个命名卷或绑定挂载位置。 |
Docker 守护进程中的一个命名卷,其名称源自镜像名称。 |
|
|
一个缓存,包含由构建包(buildpacks)创建并在镜像构建过程中使用的层。 其值可以是一个命名卷(named volume)或绑定挂载(bind mount)的位置。 |
Docker 守护进程中的一个命名卷,其名称源自镜像名称。 |
|
|
一个包含由构建包(buildpacks)创建的层(layers)并被镜像启动过程使用的缓存。 该值可以是一个命名卷(named volume)或绑定挂载(bind mount)的位置。 |
Docker 守护进程中的一个命名卷,其名称源自镜像名称。 |
|
|
|
一个用于设置生成图像元数据中 |
一个固定的日期,用于实现构建可重现性。 |
|
|
应用程序内容将被上传到构建器镜像中的目录路径。 在生成的镜像中,应用程序内容也将位于此位置。 |
|
|
|
安全选项,将以字符串数组的形式提供,并应用于构建器容器 |
|
该插件使用 JavaPlugin 的 targetCompatibility 属性来检测项目的 Java 目标兼容性。
当使用默认的 Paketo 构建器和构建包时,该插件会指示构建包安装相同版本的 Java。
您可以按照构建器配置示例中所示的方式覆盖此行为。 |
默认构建器 paketobuildpacks/builder-noble-java-tiny:latest 包含一个精简的系统库集合,并且不包含 shell。
需要 shell 来运行启动脚本的应用程序(例如当 application 插件 被应用以生成分发 zip 归档时),或者依赖于当前不存在的系统库的应用程序,应覆盖 runImage 配置,以使用包含 shell 和更广泛系统库的构建器,例如 paketobuildpacks/ubuntu-noble-run:latest。 |
标签格式
提供给 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将按原样使用
<h1>示例</h1>
自定义镜像构建器和运行镜像
如果你需要自定义用于创建镜像的构建器,或用于启动已构建镜像的运行镜像,请按照以下示例配置该任务:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
builder = "mine/java-cnb-builder"
runImage = "mine/java-cnb-run"
}
tasks.named<BootBuildImage>("bootBuildImage") {
builder.set("mine/java-cnb-builder")
runImage.set("mine/java-cnb-run")
}
此配置将使用名为 mine/java-cnb-builder、标签为 latest 的构建镜像,以及名为 mine/java-cnb-run、标签为 latest 的运行镜像。
构建镜像和运行镜像也可以在命令行中指定,如下例所示:
$ gradle bootBuildImage --builder=mine/java-cnb-builder --runImage=mine/java-cnb-run
构建器配置
如果构建器提供了配置选项,则可以使用 environment 属性进行设置。
以下是在构建时配置Paketo Java构建包所使用的JVM版本的示例:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
environment["BP_JVM_VERSION"] = "17"
}
tasks.named<BootBuildImage>("bootBuildImage") {
environment.put("BP_JVM_VERSION", "17")
}
如果在运行构建器的 Docker 守护进程与构建包下载制品的网络位置之间存在网络代理,则需要配置构建器以使用该代理。
当使用 Paketo 构建器时,可以通过设置 HTTPS_PROXY 和/或 HTTP_PROXY 环境变量来实现,如下例所示:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
environment["HTTP_PROXY"] = "http://proxy.example.com"
environment["HTTPS_PROXY"] = "https://proxy.example.com"
}
tasks.named<BootBuildImage>("bootBuildImage") {
environment.putAll(mapOf("HTTP_PROXY" to "http://proxy.example.com",
"HTTPS_PROXY" to "https://proxy.example.com"))
}
运行时 JVM 配置
Paketo Java 构建包通过设置 https://paketo.io/docs/buildpacks/language-family-buildpacks/java/#runtime-jvm-configuration 环境变量来配置 JVM 运行时环境。
当应用程序镜像在容器中启动时,可以修改构建包提供的 JAVA_TOOL_OPTIONS 值,以自定义 JVM 运行时行为。
应存储在镜像中并应用于每次部署的环境变量修改,可按照Paketo 文档中的说明进行设置,如下例所示:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
environment["BPE_DELIM_JAVA_TOOL_OPTIONS"] = " "
environment["BPE_APPEND_JAVA_TOOL_OPTIONS"] = "-XX:+HeapDumpOnOutOfMemoryError"
}
tasks.named<BootBuildImage>("bootBuildImage") {
environment.putAll(mapOf(
"BPE_DELIM_JAVA_TOOL_OPTIONS" to " ",
"BPE_APPEND_JAVA_TOOL_OPTIONS" to "-XX:+HeapDumpOnOutOfMemoryError"
))
}
自定义镜像名称
默认情况下,镜像名称会根据项目的 name 和 version 自动推断得出,类似于 docker.io/library/${project.name}:${project.version}。
你可以通过设置任务属性来控制镜像名称,如下例所示:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
imageName = "example.com/library/${project.name}"
}
tasks.named<BootBuildImage>("bootBuildImage") {
imageName.set("example.com/library/${project.name}")
}
请注意,此配置未提供显式的标签,因此使用了 latest。
也可以指定一个标签,可以使用 ${project.version}、构建中可用的任意属性,或者一个硬编码的版本号。
镜像名称也可以在命令行中指定,如本例所示:
$ gradle bootBuildImage --imageName=example.com/library/my-app:v1
构建包
默认情况下,构建器将使用构建器镜像中包含的构建包,并按照预定义的顺序应用它们。 可以提供另一组构建包,以应用未包含在构建器中的构建包,或更改已包含构建包的应用顺序。 当提供一个或多个构建包时,将仅应用所指定的构建包。
以下示例指示构建器使用一个打包在 .tgz 文件中的自定义构建包,然后使用构建器中包含的构建包。
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
buildpacks = ["file:///path/to/example-buildpack.tgz", "urn:cnb:builder:paketo-buildpacks/java"]
}
tasks.named<BootBuildImage>("bootBuildImage") {
buildpacks.set(listOf("file:///path/to/example-buildpack.tgz", "urn:cnb:builder:paketo-buildpacks/java"))
}
构建包(Buildpacks)可以以如下所示的任意形式指定。
位于 CNB 构建器中的一个构建包(如果该构建器中只有一个构建包与 buildpack-id 匹配,则版本号可以省略):
-
urn:cnb:builder:buildpack-id -
urn:cnb:builder:[email protected] -
buildpack-id
指向包含构建包(buildpack)内容的目录的路径(在 Windows 上不受支持):
-
file:///path/to/buildpack/ -
/path/to/buildpack/
一个指向包含构建包内容的 gzip 压缩 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 属性,则该值会传递给注册表,但不会用于确定发布注册表的位置。 |
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
imageName.set("docker.example.com/library/${project.name}")
publish = true
docker {
publishRegistry {
username = "user"
password = "secret"
}
}
}
tasks.named<BootBuildImage>("bootBuildImage") {
imageName.set("docker.example.com/library/${project.name}")
publish.set(true)
docker {
publishRegistry {
username.set("user")
password.set("secret")
}
}
}
发布选项也可以在命令行中指定,如下例所示:
$ gradle bootBuildImage --imageName=docker.example.com/library/my-app:v1 --publishImage
构建器缓存和工作区配置
CNB 构建器会缓存构建和启动镜像时所使用的层。 默认情况下,这些缓存以命名卷的形式存储在 Docker 守护进程中,其名称由目标镜像的完整名称派生而来。 如果镜像名称频繁变动(例如,在镜像名称中使用项目版本作为标签),则缓存可能会频繁失效。
可以配置缓存卷使用替代名称,以对缓存生命周期实现更精细的控制,如下例所示:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
buildCache {
volume {
name = "cache-${rootProject.name}.build"
}
}
launchCache {
volume {
name = "cache-${rootProject.name}.launch"
}
}
}
tasks.named<BootBuildImage>("bootBuildImage") {
buildCache {
volume {
name.set("cache-${rootProject.name}.build")
}
}
launchCache {
volume {
name.set("cache-${rootProject.name}.launch")
}
}
}
构建器(Builders)和构建包(buildpacks)在构建镜像过程中需要一个位置来存储临时文件。 默认情况下,此临时构建工作区存储在一个命名卷(named volume)中。
缓存和构建工作区可以配置为使用绑定挂载(bind mounts)而非命名卷(named volumes),如下例所示:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
buildWorkspace {
bind {
source = "/tmp/cache-${rootProject.name}.work"
}
}
buildCache {
bind {
source = "/tmp/cache-${rootProject.name}.build"
}
}
launchCache {
bind {
source = "/tmp/cache-${rootProject.name}.launch"
}
}
}
tasks.named<BootBuildImage>("bootBuildImage") {
buildWorkspace {
bind {
source.set("/tmp/cache-${rootProject.name}.work")
}
}
buildCache {
bind {
source.set("/tmp/cache-${rootProject.name}.build")
}
}
launchCache {
bind {
source.set("/tmp/cache-${rootProject.name}.launch")
}
}
}
Docker 配置
minikube 的 Docker 配置
该插件可以与由 minikube 提供的 Docker 守护进程通信,而不是使用默认的本地连接。
在 Linux 和 macOS 上,启动 minikube 后,可以使用命令 eval $(minikube docker-env) 来设置环境变量。
也可以通过提供类似于以下示例所示的连接详细信息,将该插件配置为使用 minikube 守护进程:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
docker {
host = "tcp://192.168.99.100:2376"
tlsVerify = true
certPath = "/home/user/.minikube/certs"
}
}
tasks.named<BootBuildImage>("bootBuildImage") {
docker {
host.set("tcp://192.168.99.100:2376")
tlsVerify.set(true)
certPath.set("/home/user/.minikube/certs")
}
}
Podman 的 Docker 配置
该插件可以与 Podman 容器引擎 进行通信。
可以通过提供类似于以下示例所示的连接详细信息,将该插件配置为使用 Podman 本地连接:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
docker {
host = "unix:///run/user/1000/podman/podman.sock"
bindHostToBuilder = true
}
}
tasks.named<BootBuildImage>("bootBuildImage") {
docker {
host.set("unix:///run/user/1000/podman/podman.sock")
bindHostToBuilder.set(true)
}
}
安装了 podman CLI 后,可以使用命令 podman info --format='{{.Host.RemoteSocket.Path}}' 来获取本示例中所示的 docker.host 配置属性的值。 |
Colima 的 Docker 配置
该插件可以与由 Colima 提供的 Docker 守护进程进行通信。
可以通过以下命令设置 DOCKER_HOST 环境变量:
$ export DOCKER_HOST=$(docker context inspect colima -f '{{.Endpoints.docker.Host}}')
该插件也可以通过提供类似于以下示例所示的连接详细信息,配置为使用 Colima 守护进程:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
docker {
host = "unix://${System.properties['user.home']}/.colima/docker.sock"
}
}
tasks.named<BootBuildImage>("bootBuildImage") {
docker {
host.set("unix://${System.getProperty("user.home")}/.colima/docker.sock")
}
}
Docker 身份验证配置
如果构建器镜像(builder image)或运行镜像(run image)存储在支持用户身份验证的私有 Docker 注册表中,则可以使用 docker.builderRegistry 属性提供身份验证详细信息,如下例所示:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
docker {
builderRegistry {
username = "user"
password = "secret"
url = "https://docker.example.com/v1/"
email = "[email protected]"
}
}
}
tasks.named<BootBuildImage>("bootBuildImage") {
docker {
builderRegistry {
username.set("user")
password.set("secret")
url.set("https://docker.example.com/v1/")
email.set("[email protected]")
}
}
}
如果构建器镜像或运行镜像存储在支持Tokens认证的私有 Docker 仓库中,则可以使用 docker.builderRegistry 提供Tokens值,如下例所示:
-
Groovy
-
Kotlin
tasks.named("bootBuildImage") {
docker {
builderRegistry {
token = "9cbaf023786cd7..."
}
}
}
tasks.named<BootBuildImage>("bootBuildImage") {
docker {
builderRegistry {
token.set("9cbaf023786cd7...")
}
}
}