写点什么

DHorse 系列文章之镜像制作

作者:tiandizhiguai
  • 2022-11-24
    浙江
  • 本文字数:1990 字

    阅读完需:约 7 分钟

制作镜像常用的工具

使用 Docker 制作镜像

1.使用 docker commit 制作该命令使用比较简单,可以自行网上搜索教程。2.使用 Dockerfile 制作这种方式,需要编写如下的 Dokerfile 文件:


FROM openjdk:openjdk:13-jdk-alpineADD client-1.0.0.jar /client.jarENTRYPOINT ["java","-jar","/client.jar"]
复制代码


并且执行如下命令:


docker build -t dhorse/client:102 .
复制代码


才能完成镜像的制作。通过以上可以看出,如果要使用 docker 制作镜像的话,必须要有 docker 环境,而且需要编写 Dockerfile 文件。当然,也可以不用安装 docker 环境,而且使用 doker 的远程接口:post/build。但是,在远程服务器中仍然需要安装 doker 环境和编写 Dockerfile。

DHorse的技术选型

DHorse作为一个简单易用的 DevOps 开发平台,在一开始设计时就考虑到了对外部环境的依赖性。无论是从安装还是从使用的角度,都应该尽量减少对外部环境的依赖,尤其是对 docker 的依赖。不依赖 docker 还有另外一个重要的原因,k8s 在高版本也逐渐不依赖 docker 了。而 DHorse 主要还是基于 k8s 来实现部署的,因此 DHorse 在构建镜像时更不能依赖 docker 环境。那么,在不依赖 docker 的情况下,是否可以通过其他技术构建镜像呢?答案是有的,比如通过 Jib 就可以实现。

Jib 介绍

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.22.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 来实现。

用户头像

tiandizhiguai

关注

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

还未添加个人简介

评论

发布
暂无评论
DHorse系列文章之镜像制作_云原生_tiandizhiguai_InfoQ写作社区