java - 如何减小我的 java/gradle docker 镜像大小?

我有一个 Docker 文件,如下所示:

FROM openjdk:8

ADD . /usr/share/app-name-tmp

WORKDIR /usr/share/app-name-tmp

RUN ./gradlew build \
    mv ./build/libs/app-name*.jar /usr/share/app-name/app-name.jar

WORKDIR /usr/share/app-name

RUN rm -rf /usr/share/app-name-tmp

EXPOSE 8080

RUN chmod +x ./docker-entry.sh

ENTRYPOINT [ "./docker-entry.sh" ]

问题是最终图像大小为 1.1GB,我知道这是因为 gradle 下载并存储了所有依赖项。删除那些不必要的文件并保留 jar 的最佳方法是什么?

最佳答案

我真的对你的图片大小感到困惑。我有典型的 Spring Boot 应用程序,提供 REST 服务,包括不到 200MB 的嵌入式 servlet 容器!看起来您的项目依赖项可以而且应该进行优化。

Docker 镜像

openjdk:8(243MB 压缩)可以替换为具有缩减的 Alpine unix 镜像,例如 openjdk:8-jdk-alpine (52MB) 作为基础图片,但如果您不需要编译器功能(例如,不使用 JSP),您也可以选择仅包含运行时的 openjdk:8-jre-alpine (42MB),查看Docker Hub .我将它用于基于 Spring Boot 的 REST 服务,效果很好。

Java 依赖项

必须包含编译和运行时所需的 Java 依赖项,但您可能包含未使用的依赖项:

  • 检查您的依赖关系,当前编译/运行时依赖关系是否真正使用过,或者是否可以删除或移动以进行测试,请参阅 Gradle Java Plugin
  • 一些依赖有很多传递依赖(使用gradle dependencies显示),检查不必要的,如果不使用就排除它们,见Gradle Dependency Management .确保在最终应用之前进行集成测试,一些传递依赖项没有很好的文档记录,但可能是必不可少的!

https://stackoverflow.com/questions/40958062/

相关文章:

docker - Alpine Linux 处理证书的方式与 Busybox 不同吗?

python - 如何在构建过程中安装私有(private) Python 包

docker - Artifactory 作为 docker 注册表

ssl - 在 Synology NAS 上使用 Docker 在 GitLab 上启用 SSL

docker - 如何在 Docker 内的 Jenkins 中运行 Katalon 测试套件

node.js - 为什么 NPM 在 Docker 容器中不可用

linux - 如何删除所有 Docker 容器

git - 何时从 Docker 存储库中提取,何时从 Git 存储库中提取然后构建?

node.js - node_modules 上的 docker-compose 卷但为空

docker - 使用 pyodbc 将 docker python 连接到 SQL 服务器