云原生之深入解析如何无需依赖Docker环境制作Java应用镜像

  • 随着高版本的 Kubernetes 弃用 Docker,企业也可以不依赖 Docker 环境,但是 DevOps 通过 Kubernetes 部署的话,仍然需要制作镜像,那么在没有 Docker 环境的情况下如何制作呢?
  • 推荐一款谷歌的开源工具 Jib:Jib 的 github 地址。它是一个无需 Docker 守护进程,也无需深入掌握 Docker 最佳实践的情况下,为 Java 应用程序构建 Docker 和 OCI 镜像, 它可以作为 Maven 和 Gradle 的插件,也可以作为 Java 库。
  • 比如,使用 jib-maven-plugin 插件构建镜像的代码如下:
rust 复制代码
<plugin>
 <groupId>com.google.cloud.tools</groupId>
 <artifactId>jib-maven-plugin</artifactId>
 <version>3.3.0</version>
 <configuration>
  <from>
   <image>openjdk:13-jdk-alpine</image>
  </from>
  <to>
   <image>gcr.io/dhorse/client</image>
   <tags>
    <tag>102</tag>
   </tags>
   <auth>
    <!--连接镜像仓库的账号和密码 -->
    <username>username</username>
    <password>password</password>
   </auth>
  </to>
  <container>
   <ports>
    <port>8080</port>
   </ports>
  </container>
 </configuration>
 <executions>
  <execution>
   <phase>package</phase>
   <goals>
    <goal>build</goal>
   </goals>
  </execution>
 </executions>
</plugin>
  • 然后使用命令进行构建:
rust 复制代码
mvn compile jib:build
  • 可以看出,无需 docker 环境就可以实现镜像的构建。但是,要想通过平台类型的系统去为每个系统构建镜像,显然通过插件的方式,不太合适,因为需要每个被构建系统引入 jib-maven-plugin 插件才行,也就是需要改造每一个系统,这样就会带来一定的麻烦。那么有没有不需要改造系统的方式直接进行构建镜像呢?答案是通过 Jib-core 就可以实现。
  • 首先,在使用 Jib-core 的项目中引入依赖,maven 如下:
rust 复制代码
<dependency>
 <groupId>com.google.cloud.tools</groupId>
 <artifactId>jib-core</artifactId>
 <version>0.23.0</version>
</dependency>
  • 通过 DHorse 的代码: 看 Jib-core 是如何使用的,如下:
rust 复制代码
try {
 JibContainerBuilder jibContainerBuilder = null;
 if (StringUtils.isBlank(context.getProject().getBaseImage())) {
  jibContainerBuilder = Jib.fromScratch();
 } else {
  jibContainerBuilder = Jib.from(context.getProject().getBaseImage());
 }
 //连接镜像仓库5秒超时
 System.setProperty("jib.httpTimeout", "5000");
 System.setProperty("sendCredentialsOverHttp", "true");
 String fileNameWithExtension = targetFiles.get(0).toFile().getName();
 List<String> entrypoint = Arrays.asList("java", "-jar", fileNameWithExtension);
 RegistryImage registryImage = RegistryImage.named(context.getFullNameOfImage()).addCredential(
   context.getGlobalConfigAgg().getImageRepo().getAuthUser(),
   context.getGlobalConfigAgg().getImageRepo().getAuthPassword());
 jibContainerBuilder.addLayer(targetFiles, "/")
  .setEntrypoint(entrypoint)
  .addVolume(AbsoluteUnixPath.fromPath(Paths.get("/etc/localtime")))
  .containerize(Containerizer.to(registryImage)
    .setAllowInsecureRegistries(true)
    .addEventHandler(LogEvent.class, logEvent -> logger.info(logEvent.getMessage())));
} catch (Exception e) {
 logger.error("Failed to build image", e);
 return false;
}
  • 其中,targetFiles 是要构建镜像的目标文件,比如 springboot 打包后的 jar 文件。通过 Jib-core,可以很轻松的实现镜像构建,而不需要依赖任何其他环境,也不需要被构建系统做任何改造,非常方便。
  • 如果有此需求,也可以通过 Jib-core 来实现,可以通过 DHorse 了解更多。
相关推荐
HalvmånEver18 小时前
7.高并发内存池大页内存申请释放以及使用定长内存池脱离new
java·spring boot·spring
凤山老林18 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
小夏卷编程19 小时前
Ubuntu 20.04.4 宝塔 docker showdoc v3.2 更新到v3.7.3
运维·docker·容器
JEECG低代码平台19 小时前
JeecgBoot低代码平台 Docker 部署 OnlyOffice 文档服务完整指南
低代码·docker·容器
赶路人儿19 小时前
UTC时间和时间戳介绍
java·开发语言
dreamread19 小时前
【SpringBoot整合系列】SpringBoot3.x整合Swagger
java·spring boot·后端
6+h19 小时前
【java】基本数据类型与包装类:拆箱装箱机制
java·开发语言·python
一直都在57220 小时前
Spring面经
java·后端·spring
xiaoye370820 小时前
如何在Spring中使用注解配置Bean的生命周期回调方法?
java·spring
生活爱好者!20 小时前
NAS帮我找回童年的快乐!部署 小游戏
运维·服务器·docker·容器·娱乐