使用 Jib 代替 Docker CLI 打包一个 Spring Boot 应用

一般在将应用(本文指 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 参数是用来设置镜像名称的。

我们登录阿里云看看构建结果:

使用 Jib 代替 Docker CLI 打包一个 Spring Boot 应用

嗯,也成功了。

你可能会疑惑,这个过程不用输入密码吗?

当然要,之所以没输入密码也能成功,是因为我的电脑之前通过 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 远程仓库的域名、usernamepassword 不说自明。(更安全的放置密码的方法见这里 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 CLI 打包一个 Spring Boot 应用

以上就是 Jib 的简单入门了。

掌握了这个,以后开发者的电脑以及发布机上,都不用装 Docker 相关组件就能直接构建 Docker 镜像了。美滋滋~

参考

  • Jib 官方文档[3]
  • Containerizing Spring Boot Application with Jib[4]

参考资料

[1]

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!