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

Create optimized docker image with multi layer jar file using Gradle

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

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

我当前的Docker文件:

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:我试图在不使用任何插件的情况下实现这个目标(如果可能的话)。

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

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

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