【问题标题】:Create optimized docker image with multi layer jar file using Gradle使用 Gradle 创建具有多层 jar 文件的优化 docker 映像
【发布时间】:2021-05-11 15:33:44
【问题描述】:

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

【问题讨论】:

    标签: java docker gradle jar


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答。图书馆对我来说似乎很有趣,我会检查一下。但我正在寻找一个不需要任何插件的解决方案。 TBH,创建 Docker 映像的插件使项目变得不清楚或不可读,因为您必须进行大量搜索才能了解项目的构建方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多