使用 Gradle 使用多层 jar 文件创建优化的 docker 镜像

时间:2021-05-11 15:33:44

标签: java docker gradle jar

我正在尝试构建一个高效的 Docker 镜像,该镜像利用 Docker 的镜像分层来减少上传到存储库或从存储库下载的持续时间和所需的带宽。有什么方法可以使用 Gradle 构建工具来分离我编译的代码和依赖项(外部库)?

我当前的 Dockerfilefat jar 复制到容器中,而 jar 文件中最重要的部分是在不同版本之间不会更改的库。

我当前的 Dockerfile:

FROM openjdk:11-jre-slim

VOLUME /tmp

WORKDIR /app

# Add the application's jar to the container
COPY /build/libs/app-*.jar app.jar

# Run the jar file
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]

编辑 1:我试图在不使用任何插件的情况下实现这个目标(如果可能的话)。

1 个答案:

答案 0 :(得分:1)

好吧,也许像 https://github.com/GoogleContainerTools/jib 这样的工具更符合您的需求?它正是为这种用例而设计的。

使用“纯”Docker,整个构建在您的 Dockerfile 中完成,在开始时使用一个命令来下载依赖项,然后THEN将您的代码添加到带有副本的映像中。这样,可以缓存第一层。那么您可能应该从官方 Gradle 图像开始。由于将包含您的依赖项,您甚至可以通过直接调用 Gradle 来运行您的软件。图像大小会更大,但每次只会通过网络发送您的代码,除非您的依赖项发生变化。

还有很多其他选项可以实现与 Docker 类似的功能,但其中许多选项通过使用本地缓存或直接从目标机器下载依赖项,破坏了构建的可重复性。它们可以工作,但随后你就失去了 Docker 的“通用容器”方法。