• DHorse系列文章之镜像制作


    DHorse系列文章之镜像制作

    制作镜像常用的工具

    使用Docker制作镜像

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

    FROM openjdk:openjdk:13-jdk-alpine
    ADD client-1.0.0.jar /client.jar
    ENTRYPOINT ["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.toolsgroupId>
    	<artifactId>jib-maven-pluginartifactId>
    	<version>3.3.0version>
    	<configuration>
    		<from>
    			<image>openjdk:13-jdk-alpineimage>
    		from>
    		<to>
    			<image>gcr.io/dhorse/clientimage>
    			<tags>
    				<tag>102tag>
    			tags>
    			<auth>
    				
    				<username>usernameusername>
    				<password>passwordpassword>
    			auth>
    		to>
    		<container>
    			<ports>
    				<port>8080port>
    			ports>
    		container>
    	configuration>
    	<executions>
    		<execution>
    			<phase>packagephase>
    			<goals>
    				<goal>buildgoal>
    			goals>
    		execution>
    	executions>
    plugin>
    

    然后使用命令进行构建:

    mvn compile jib:build
    

    可以看出,无需docker环境就可以实现镜像的构建。但是,要想通过平台类型的系统去为每个系统构建镜像,显然通过插件的方式,不太合适,因为需要每个被构建系统引入jib-maven-plugin插件才行,也就是需要改造每一个系统,这样就会带来一定的麻烦。那么有没有不需要改造系统的方式直接进行构建镜像呢?答案是通过Jib-core就可以实现。

    首先,在使用Jib-core的项目中引入依赖,maven如下:

    <dependency>
    	<groupId>com.google.cloud.toolsgroupId>
    	<artifactId>jib-coreartifactId>
    	<version>0.22.0version>
    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 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来实现。

  • 相关阅读:
    [GXYCTF2019]BabyUpload
    ESP32设备驱动-OLED显示单个或多个DS18B20传感器数据
    尝试使用php给pdf添加水印
    图解redis(二)——持久化篇
    0-搭建nodejs环境
    Linux内核驱动开发-001字符设备开发-内核中断驱动独立按键
    基于node的tcp客户端和服务端的简单通信
    ansible自动化运维工具的使用
    RFID电子标签实现仓储物流托盘智能化管理
    huggingface Tokenizers 官网文档学习:tokenizer训练保存与使用
  • 原文地址:https://www.cnblogs.com/tiandizhiguai/p/16902889.html