写点什么

无需依赖 Docker 环境制作镜像

作者:tiandizhiguai
  • 2023-02-15
    浙江
  • 本文字数:1578 字

    阅读完需:约 5 分钟

随着高版本的 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>
复制代码


然后使用命令进行构建:


mvn compile jib:build
复制代码


可以看出,无需 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了解更多。

用户头像

tiandizhiguai

关注

我笑世人看不穿 2018-11-08 加入

还未添加个人简介

评论

发布
暂无评论
无需依赖Docker环境制作镜像_Docker_tiandizhiguai_InfoQ写作社区