随着高版本的 Kubernetes 弃用 Docker,企业也可以不依赖 Docker 环境了,但是 DevOps 通过 Kubernetes 部署的话,仍然需要制作镜像,那么在没有 Docker 环境的情况下如何制作呢?推荐一款谷歌的开源工具 Jib,github地址,它是一个无需 Docker 守护进程——也无需深入掌握 Docker 最佳实践的情况下,为 Java 应用程序构建 Docker 和 OCI 镜像, 它可以作为 Maven 和 Gradle 的插件,也可以作为 Java 库。
比如,使用 jib-maven-plugin 插件构建镜像的代码如下:
<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>
复制代码
然后使用命令进行构建:
可以看出,无需 docker 环境就可以实现镜像的构建。但是,要想通过平台类型的系统去为每个系统构建镜像,显然通过插件的方式,不太合适,因为需要每个被构建系统引入 jib-maven-plugin 插件才行,也就是需要改造每一个系统,这样就会带来一定的麻烦。那么有没有不需要改造系统的方式直接进行构建镜像呢?答案是通过 Jib-core 就可以实现。
首先,在使用 Jib-core 的项目中引入依赖,maven 如下:
<dependency> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-core</artifactId> <version>0.23.0</version></dependency>
复制代码
下面通过DHorse的代码,看 Jib-core 是如何使用的,如下:
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了解更多。
评论