方法。
这篇文章是关于利用Jib,更具体地说是 jib-maven-plugin 来构建容器化的spring boot应用程序。Jib可以让不写Dockerfile就能实现Docker打包。
这篇文章中使用的演示项目可以在 这里 找到。
什么是Jib
Jib带来的是,它允许您通过简单地将插件添加到您选择的构建工具(Maven或Gradle)来创建容器。没有额外的文件,只需几行配置,它处理将应用程序打包到容器映像的所有步骤。
使用Google云团队 自己的话 :
Jib是来自Google的开源Java容器,它允许Java开发人员使用他们所知道的Java工具构建容器。它不需要您编写Dockerfile或安装了docker,它直接集成到 Maven 和 Gradle中 。
在“传统”Java到Docker映像构建流程中,我们需要安装Dockerfile和docker守护进程。在Jib构建流程中,您只需要插件项目的构建文件。
构建
设置Java开发环境不属于本文的范围,但让我们试一试!
创建一个基本的spring boot应用程序
这可以通过spring initializr 或您喜欢的IDE来完成。如果您使用了spring initializr,则需要将新创建的maven项目导入IDE( eclipse / idea )。
将jib-maven-plugin添加到您的pom.xml中
对于应用程序的基本本地存储镜像,请在pom.xml以下内容中配置jib-maven-plugin :
<build> <plugins> <plugin> ... </plugin> ... <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>0.10.1</version> <configuration> <to> <image>springbootjib</image> </to> </configuration>‘
编译应用程序并构建镜像
现在我们可以构建应用程序并检查镜像是否在我们的本地docker存储库中创建。
通过终端转到项目的根文件夹,然后执行:
mvn compile jib:dockerBuild
Maven构建日志应包含如下行:
[INFO] — — jib-maven-plugin:0.10.1:dockerBuild (default-cli) @ spring-boot-jib — - <p>[INFO] <p>[INFO] Containerizing application to Docker daemon as springbootjib… <p>[WARNING] Base image ‘gcr.io/distroless/java’ does not use a specific image digest — build may not be reproducible <p>[INFO] Getting base image gcr.io/distroless/java… <p>[INFO] Building dependencies layer… <p>[INFO] Building resources layer… <p>[INFO] Building classes layer… <p>[INFO] Finalizing… <p>[INFO] <p>[INFO] Container entrypoint set to [java, -cp, /app/resources:/app/classes:/app/libs/*, com.jibdemo.SpringBootJibApplication] <p>[INFO] Loading to Docker daemon… <p>[INFO] <p>[INFO] Built image to Docker daemon as springbootjib
只要没有错误,我们就会看到maven“ Built image to Docker daemon as springbootjib”我们都已经确定了。
运行docker镜像
我们应该在本地存储库中拥有新的docker镜像。我们可以通过执行检查docker image ls,我们应该看到类似于这样的镜像:
springbootjib latest eb4bea693650 3 hours ago 135MB
请注意非常小的(135mb)镜像大小,这是由于gcr.io/distroless/javaJib默认使用的镜像(我们将在稍后看到如何更改)。
因此,现在我们可以像往常一样通过键入docker run -it springbootjib并验证应用程序是否按预期运行来运行镜像。
配置Jib插件以微调我们的Docker镜像
我们可以深入挖掘,并进一步配置Jib插件,以适应几种常见的场景,例如登录docker存储库,暴露端口,选择特定的基本映像等。
例如,在以下配置中:
<configuration> <from> <image>openjdk:alpine</image> </from> <to> <image>localhost:5000/springbootjib:0.0.1-SNAPSHOT</image> <credHelper>osxkeychain</credHelper> <tags> <tag>alpine</tag> <tag>latest</tag> </tags> </to> <container> <jvmFlags> <jvmFlag>-Xms256m</jvmFlag> <jvmFlag>-Xdebug</jvmFlag> </jvmFlags> <ports> <port>8081</port> <port>8082-8083/udp</port> </ports> <labels> <name>springbootjib</name> </labels> <format>OCI</format> </container> </configuration>
在,您可以再次构建镜像,并查看maven日志中的差异:
[INFO] --- jib-maven-plugin:0.10.1:dockerBuild (default-cli) @ spring-boot-jib --- <p>[INFO] <p>[INFO] Containerizing application to Docker daemon as localhost:5000/springbootjib:0.0.1-SNAPSHOT, localhost:5000/springbootjib:alpine, localhost:5000/springbootjib... <p>[INFO] Getting base image openjdk:alpine... <p>[INFO] Building dependencies layer... <p>[INFO] Building resources layer... <p>[INFO] Building classes layer... <p>[INFO] The base image requires auth. Trying again for openjdk:alpine... <p>[INFO] Retrieving registry credentials for registry.hub.docker.com... <p>[INFO] Finalizing... <p>[INFO] <p>[INFO] Container entrypoint set to [java, -Xms256m, -Xdebug, -cp, /app/resources:/app/classes:/app/libs/*, com.jibdemo.SpringBootJibApplication] <p>[INFO] Loading to Docker daemon... <p>[INFO] <p>[INFO] Built image to Docker daemon as localhost:5000/springbootjib:0.0.1-SNAPSHOT, localhost:5000/springbootjib:alpine, localhost:5000/springbootjib
请注意,在上面的日志段中,插件openjdk:alpine从 Docker Hub中 提取镜像,将镜像构建为三个不同标记的版本,并将它们存储在我们的本地存储库中。
为什么用Jib?
结论
如果使用过像 spotify 和 fabric8 那样的其他maven插件来为java应用程序创建 docker 图像,建议你使用Google的jib,它需要的文件少于fabric8的插件,并且(我认为)比spotify的插件更容易配置。我当然建议你试一试!