使用Jib容器化你的Maven项目

Jib是为您的Java应用程序构建DockerOCI镜像的Maven插件。
有关项目的信息,请参见Jib项目自述文件。对于Gradle插件,请参阅jib-gradle-plugin项目

快速启动

您可以用一个命令轻松地封装应用程序:

1
mvn compile com.google.cloud.tools:jib-maven-plugin:0.9.11:build -Dimage=<MY IMAGE>

这为您的应用程序构建容器容器并将容器映像推送到容器注册表中。如果遇到身份验证问题,请参见身份验证方法。

要生成Docker守护进程,请使用:

1
mvn compile com.google.cloud.tools:jib-maven-plugin:0.9.11:dockerBuild

如果您想将Jib设置为Maven构建的一部分,请遵循下面的指南。

安装程序

在您的Maven Java项目中,将插件添加到您的pom.xml中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<project>
...
<build>
<plugins>
...
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>0.9.11</version>
<configuration>
<to>
<image>myimage</image>
</to>
</configuration>
</plugin>
...
</plugins>
</build>
...
</project>

配置

通过将镜像设置为“推送”来配置插件:

使用谷歌容器

确保你有docker-credential-gcr命令行工具。Jib自动使用docker-credential-gcr来获取凭证。参阅其他认证的验证方法

例如,为了构建镜像gcr.io/my-gcp-project/my-app,配置将是:

1
2
3
4
5
<configuration>
<to>
<image>gcr.io/my-gcp-project/my-app</image>
</to>
</configuration>

使用亚马逊容器

确保你有docker-credential-ecr-login命令行工具。Jib自动使用docker-credential-ecr-login来获取凭证。参阅其他认证的验证方法

例如,为了构建镜像aws_account_id.dkr.ecr.region.amazonaws.com/my-app,配置将是:

1
2
3
4
5
<configuration>
<to>
<image>aws_account_id.dkr.ecr.region.amazonaws.com/my-app</image>
</to>
</configuration>

使用Docker容器

确保你有一个 docker-credential-helper设置。例如,在macOS,凭证助手将是docker-credential-osxkeychain。参阅其他认证的验证方法

例如,为了构建镜像my-docker-id/my-app,配置将是:

1
2
3
4
5
<configuration>
<to>
<image>registry.hub.docker.com/my-docker-id/my-app</image>
</to>
</configuration>

创建镜像

用以下方法构建容器镜像:

1
mvn compile jib:build

后续生成比初始构建快得多。

构建Docker守护进程

Jib还可以将你的镜像直接构建到Docker守护进程。这使用Docker命令行工具,并要求在路径上有可用的Docker

1
mvn compile jib:dockerBuild

如果使用minikube的远程Docker守护进程,请确保设置了正确的环境变量以指向远程守护进程:

1
2
eval $(minikube docker-env)
mvn compile jib:dockerBuild

绑定到生命周期

还可以通过将下列执行添加到jib-maven-plugin定义中,将jib:build绑定到Maven生命周期,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
<plugin>
<groupId>com.google.com.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
...
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>

然后,您可以通过运行来构建容器镜像:

1
mvn package

导出到Docker上下文

Jib还可以导出DOCKER上下文,以便您可以与Docker一起构建,如果需要的话:

1
mvn compile jib:exportDockerContext

默认情况下,Docker上下文将在target/jib-docker-context中创建。您可以使用targetDir配置选项或jibTargetDir参数更改此目录:

1
mvn compile jib:exportDockerContext -DjibTargetDir=my/docker/context/

然后你可以用Docker来构建你的镜像:

1
docker build -t myimage my/docker/context/

扩展使用

扩展选项提供额外的配置选项为定制镜像生成。

属性 类型 默认值 描述
to to Required 配置目标镜像以构建应用程序。
from from 查看from 配置基础镜像以构建应用程序的顶部。
container container 查看container 配置从镜像中运行的容器。
allowInsecureRegistries boolean false 如果设置为true,Jib忽略HTTPS证书错误,并可能退回HTTP作为最后的手段。强烈建议将这个参数设置为false,因为HTTP通信是未加密的,并且对于网络上的其他人来说是可见的,并且不安全的HTTPS并不比普通的HTTP好。如果使用自签名证书访问注册表,则将证书添加到Java运行时的可信密钥可能是启用此选项的另一种选择。
skip boolean false 如果设置为true,则跳过Jib执行(对于多模块项目是有用的)。这也可以通过-Djib.skip跳过命令行选项来指定。
useOnlyProjectCache boolean false 如果设置为true,Jib不会在不同的Maven项目之间共享缓存。

from是具有以下属性的对象:

属性 类型 默认值 描述
image string gcr.io/distroless/java 基础的镜像参考。
auth auth None 直接指定凭证。
credHelper string None 证书助手的后缀,它可以对基础镜像进行身份验证(遵循docker-credential-)。

to是具有以下属性的对象:

属性 类型 默认值 描述
image string Required 目标镜像的参考。这也可以通过-Dimage命令行选项来指定。
auth auth None 直接指定凭证。
credHelper string None 证书助手的后缀,它可以对基础镜像进行身份验证(遵循docker-credential-)。
tags list None 额外的标签推向

auth是一个具有以下属性的对象(请参阅使用特定凭据):

属性 类型 描述
username string 用户名
password string 密码

container是具有以下属性的对象:

属性 类型 默认值 描述
appRoot string /app 容器上放置应用程序内容的根目录。
args list None 默认的主方法参数来运行应用程序。
entrypoint list None 启动容器的命令(类似于Docker的入口点指令)。如果设置,则忽略jvmFlagsmainClass
environment map None 键值对,用于设置容器上的环境变量(类似于Docker的Env指令)。
format string Docker 使用OCI构建OCI容器映像
jvmFlags list None 运行应用程序时要传递给JVM的附加标志。
labels map None 用于应用镜像元数据的键值对(类似于Docker的标签指令)。
mainClass string Inferred* 主要类从应用程序启动。
ports list None 容器在运行时暴露的端口(类似于Docker的公开指令)。
useCurrentTimestamp boolean false 默认情况下,Jib擦除所有时间戳以保证再现性。如果这个参数设置为true,Jib将把镜像的创建时间戳设置为构建时间,这将牺牲可再现性,以便能够容易地判断镜像何时创建。

您还可以使用connection/read系统属性为注册表交互配置HTTP连接/读取超时,该属性通过命令行以毫秒为单位配置(缺省值是20000;您还可以将其设置为0用于无限超时):

1
mvn compile jib:build -Djib.httpTimeout=3000

例子

在这种配置中,镜像:

  • 是从openjdk:alpine的基础上建造的:(pulled from Docker Hub)
  • 被推到localhost:5000/my-image:built-with-jiblocalhost:5000/my-image:tag2localhost:5000/my-image:latest
  • 通过调用运行java -Xms512m -Xdebug -Xmy:flag=jib-rules -cp app/libs/*:app/resources:app/classes mypackage.MyApp some args
  • 暴露端口1000为TCP(默认),并且端口2000、2001、2002和2003为UDP,
  • 有两个标签(key1:value1 and key2:value2)
  • 构建为OCI格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<configuration>
<from>
<image>openjdk:alpine</image>
</from>
<to>
<image>localhost:5000/my-image:built-with-jib</image>
<credHelper>osxkeychain</credHelper>
<tags>
<tag>tag2</tag>
<tag>latest</tag>
</tags>
</to>
<container>
<jvmFlags>
<jvmFlag>-Xms512m</jvmFlag>
<jvmFlag>-Xdebug</jvmFlag>
<jvmFlag>-Xmy:flag=jib-rules</jvmFlag>
</jvmFlags>
<mainClass>mypackage.MyApp</mainClass>
<args>
<arg>some</arg>
<arg>args</arg>
</args>
<ports>
<port>1000</port>
<port>2000-2003/udp</port>
</ports>
<labels>
<key1>value1</key1>
<key2>value2</key2>
</labels>
<format>OCI</format>
</container>
</configuration>

在镜像中添加任意文件

注意:这是一个孵化的特点,并可能在未来改变。

可以将任意的、非类路径文件添加到src/main/jib目录中,从而将它们添加到镜像中。这将将jib文件夹中的所有文件复制到镜像的根目录,并保持相同的结构(例如,如果文本文件在src/main/jib/dir/hello.txt,然后你的镜像就会包含/dir/hello.txtJib建成后。

您可以使用pom.xml中的extraDirectory参数配置一个不同的目录:

1
2
3
4
5
6
<configuration>
...
<!-- Copies files from 'src/main/custom-extra-dir' instead of 'src/main/jib' -->
<extraDirectory>${project.basedir}/src/main/custom-extra-dir</extraDirectory>
...
</configuration>

认证方法

来自私人注册中心的推/拉需要授权凭证。这些可以使用Docker证书帮助器或在Maven设置中定义。如果不显式地定义凭据,Jib将尝试使用Docker配置中定义的凭据或推断公共凭据助手。

使用Docker凭证帮助器

Docker证书助手是CLI工具,它处理各种注册表的身份验证。

一些常见的证书帮助者包括:

通过将证书指定为它们各自的镜像的帮助器来配置证书助手。

示例配置:

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
...
<from>
<image>aws_account_id.dkr.ecr.region.amazonaws.com/my-base-image</image>
<credHelper>ecr-login</credHelper>
</from>
<to>
<image>gcr.io/my-gcp-project/my-app</image>
<credHelper>gcr</credHelper>
</to>
...
</configuration>

使用特定凭证

您可以在<auth>参数为from and/or to镜像。在下面的示例中,to凭据检索凭据REGISTRY_USERNAMEREGISTRY_PASSWORD环境变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<configuration>
...
<from>
<image>aws_account_id.dkr.ecr.region.amazonaws.com/my-base-image</image>
<auth>
<username>my_username</username>
<password>my_password</password>
</auth>
</from>
<to>
<image>gcr.io/my-gcp-project/my-app</image>
<auth>
<username>${env.REGISTRY_USERNAME}</username>
<password>${env.REGISTRY_PASSWORD}</password>
</auth>
</to>
...
</configuration>

或者,可以使用下面的系统属性通过命令行指定凭据。

属性 描述
-Djib.from.auth.username 基本镜像注册表的用户名。
-Djib.from.auth.password 基本镜像注册表的密码。
-Djib.to.auth.username 目标镜像注册表的用户名。
-Djib.to.auth.password 目标镜像注册表的密码。

例如:mvn compile jib:build -Djib.to.auth.username=user -Djib.to.auth.password=pass

注意:这种身份验证方法只能作为最后的手段,因为用纯文本显示密码是不安全的。

使用Maven设置

注册表凭据可以添加到您的Maven设置。如果在任何指定的Docker凭证帮助器中找不到凭据,则将使用这些凭据。

如果您考虑在Maven中设置凭据,我们强烈建议使用Maven密码加密。

示例 settings.xml:

1
2
3
4
5
6
7
8
9
10
11
<settings>
...
<servers>
...
<server>
<id>MY_REGISTRY</id>
<username>MY_USERNAME</username>
<password>{MY_SECRET}</password>
</server>
</servers>
</settings>
  • id字段应该是这些凭据所需的注册表服务器。
  • 我们不建议在settings.xml中添加原始密码。

参考地址

参考地址