一般在将应用(本文指 Java 应用)打包为容器镜像时,打包机器上要安装 Docker 相关组件(docker
cli、docker daemon等),而且还要为应用配置一个 Dockerfile
文件。如果能避免这些操作,只需要将类似功能集成到项目中,实现一键打包,岂不是更爽。
你想要的,Jib 都能满足。
我们以一个 Spring Web 项目为例,提供一个循序渐进的使用演示。
先通过 start.spring.io[1] 创建一个名为 jib-demo
的 Spring Web 项目(项目模板在这里[2])。
不借助 docker
命令行,把它打包为一个容器镜像。
场景1:
开发电脑上已经装了 Docker Desktop for Mac,想把上面的 jib-demo
项目打包到本机的 Docker daemon,用到的命令是:
mvn compile com.google.cloud.tools:jib-maven-plugin:3.0.0:dockerBuild
其中,com.google.cloud.tools:jib-maven-plugin:3.0.0
是 jib maven 插件,而 dockerBuild
是该插件提供的类似于 docker build
的一个命令。
通过 docker images
指令查看有没有构建成功,得到的输出是:
REPOSITORY TAG IMAGE ID CREATED SIZE
jib-demo 0.0.1-SNAPSHOT 0e500a1167e8 51 years ago 241MB
说明成功了。(注意这里的 CREATED
时间为 51 years ago
,即1970年,这是为了构建 reproducible 镜像,而把时间定格了。)
场景2:
电脑上没装 Docker 相关组件 ,想把项目构建完成后直接推送到 Docker 远程仓库。
以阿里云提供的容器镜像服务为例(官方 docker hub 同理):
mvn compile com.google.cloud.tools:jib-maven-plugin:3.0.0:build -Dimage=registry.cn-hangzhou.aliyuncs.com/xxx/jib-demo
显然,-Dimage
参数是用来设置镜像名称的。
我们登录阿里云看看构建结果:

嗯,也成功了。
你可能会疑惑,这个过程不用输入密码吗?
当然要,之所以没输入密码也能成功,是因为我的电脑之前通过 docker login
授权过该仓库,当运行 jib 插件时,它默认会从~/.docker/config.json
文件中读取授权信息,这从构建日期中可以看出:
[INFO] Using credentials from Docker config (/Users/youmoo/.docker/config.json) for adoptopenjdk:8-jre
[INFO] Using base image with digest: sha256:e873b3cd76edc27903a5c2d3e92dff993601367149379968ca723fe2ed820036
[INFO]
[INFO] Container entrypoint set to [java, -cp, /app/resources:/app/classes:/app/libs/*, com.example.jibdemo.JibDemoApplication]
[INFO]
[INFO] Built and pushed image as registry.cn-hangzhou.aliyuncs.com/xxx/jib-demo
场景3:
上面的命令太长,难以记住,可以直接配置在项目中吗?
当然可以。在项目下的 pom.xml
中找到 plugins
节点,加入以下子节点:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<from>
<image>gcr.io/distroless/java:8</image>
</from>
<to>
<image>registry.cn-hangzhou.aliyuncs.com/fenke/jib-demo</image>
</to>
</configuration>
</plugin>
配置也较易理解,from.image
配置基础镜像,to.image
用来配置结果镜像。更多的参数可自行参看文档。
如果你没有在打包机器上运行过 docker login
(希望你没有,因为我们本文的目的是不安装 Docker 相关组件),你还要配置 Docker 仓库的授权密码:
编辑 ~/.m2/settings.xml
,在 servers
节点下加如下配置:
<server>
<id>registry.cn-hangzhou.aliyuncs.com</id>
<username>my username</username>
<password>my password</password>
</server>
其中 id
是你 Docker 远程仓库的域名、username
和 password
不说自明。(更安全的放置密码的方法见这里 https://maven.apache.org/guides/mini/guide-encryption.html。)
然后就可以直接构建了,在项目下运行:
mvn compile jib:build
以下是部分输出结果:
[INFO]
[INFO] ----------------------------------------
[INFO] BUILD SUCCESS
[INFO] ----------------------------------------
[INFO] Total time: 4.780 s
[INFO] ----------------------------------------
在一个有权访问该仓库的机器上运行该镜像试试效果:
docker run --rm -it -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/xxx/jib-demo
一个熟悉的结果出来了:

以上就是 Jib 的简单入门了。
掌握了这个,以后开发者的电脑以及发布机上,都不用装 Docker 相关组件就能直接构建 Docker 镜像了。美滋滋~
参考
-
Jib 官方文档[3] -
Containerizing Spring Boot Application with Jib[4]
参考资料
start.spring.io: https://start.spring.io/
[2]
jib-demo 项目模板: https://start.spring.io/#!type=maven-project&language=java&platformVersion=2.4.5.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=jib-demo&name=jib-demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.jib-demo&dependencies=web
[3]
Jib 官方文档: https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin
[4]
Containerizing Spring Boot Application with Jib: https://medium.com/javarevisited/containerizing-springboot-application-with-jib-716daa3e0850
原文始发于微信公众号(背井):使用 Jib 代替 Docker CLI 打包一个 Spring Boot 应用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/246636.html