使用Jib容器化你的Maven项目
Jib
是为您的Java应用程序构建Docker
和OCI
镜像的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 | <project> |
配置
通过将镜像设置为“推送”来配置插件:
使用谷歌容器
确保你有docker-credential-gcr命令行工具。Jib自动使用docker-credential-gcr
来获取凭证。参阅其他认证的验证方法。
例如,为了构建镜像gcr.io/my-gcp-project/my-app
,配置将是:
1 | <configuration> |
使用亚马逊容器
确保你有docker-credential-ecr-login命令行工具。Jib自动使用docker-credential-ecr-login
来获取凭证。参阅其他认证的验证方法。
例如,为了构建镜像aws_account_id.dkr.ecr.region.amazonaws.com/my-app
,配置将是:
1 | <configuration> |
使用Docker容器
确保你有一个 docker-credential-helper设置。例如,在macOS,凭证助手将是docker-credential-osxkeychain
。参阅其他认证的验证方法。
例如,为了构建镜像my-docker-id/my-app
,配置将是:
1 | <configuration> |
创建镜像
用以下方法构建容器镜像:
1 | mvn compile jib:build |
后续生成比初始构建快得多。
构建Docker守护进程
Jib还可以将你的镜像直接构建到Docker守护进程。这使用Docker
命令行工具,并要求在路径上有可用的Docker
。
1 | mvn compile jib:dockerBuild |
如果使用minikube的远程Docker守护进程,请确保设置了正确的环境变量以指向远程守护进程:
1 | eval $(minikube docker-env) |
绑定到生命周期
还可以通过将下列执行添加到jib-maven-plugin
定义中,将jib:build
绑定到Maven生命周期,例如:
1 | <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的入口点指令)。如果设置,则忽略jvmFlags 和mainClass 。 |
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-jib
:localhost:5000/my-image:tag2
,localhost: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 | <configuration> |
在镜像中添加任意文件
注意:这是一个孵化的特点,并可能在未来改变。
可以将任意的、非类路径文件添加到src/main/jib
目录中,从而将它们添加到镜像中。这将将jib文件夹中的所有文件复制到镜像的根目录,并保持相同的结构(例如,如果文本文件在src/main/jib/dir/hello.txt
,然后你的镜像就会包含/dir/hello.txt
Jib建成后。
您可以使用pom.xml
中的extraDirectory
参数配置一个不同的目录:
1 | <configuration> |
认证方法
来自私人注册中心的推/拉需要授权凭证。这些可以使用Docker证书帮助器或在Maven设置中定义。如果不显式地定义凭据,Jib将尝试使用Docker配置中定义的凭据或推断公共凭据助手。
使用Docker凭证帮助器
Docker证书助手是CLI工具,它处理各种注册表的身份验证。
一些常见的证书帮助者包括:
- Google Container Registry: docker-credential-gcr
- AWS Elastic Container Registry: docker-credential-ecr-login
- Docker Hub Registry: docker-credential-*
通过将证书指定为它们各自的镜像的帮助器来配置证书助手。
示例配置:
1 | <configuration> |
使用特定凭证
您可以在<auth>
参数为from
and/or to
镜像。在下面的示例中,to
凭据检索凭据REGISTRY_USERNAME
和REGISTRY_PASSWORD
环境变量。
1 | <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 | <settings> |
- id字段应该是这些凭据所需的注册表服务器。
- 我们不建议在
settings.xml
中添加原始密码。