隨著高版本的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瞭解更多。