Docker Gradle项目生成单个JAR,但不断重build4层

使用Docker 1.12。 出于某种原因,当我构build我的Docker容器是一个Gradle 2.14项目时,它构build了胖JAR并将其存储在本地。 问题是,虽然我有一个胖的JAR被存储在Docker镜像中,但它创build了4个新的图层,每个图层大约300MB。

不知道为什么它需要一个单一的文件这么多的空间。 我怎样才能优化这个Dockerfile来防止将来呢?

我应该在容器外部build立JAR然后复制它吗?

FROM anapsix/alpine-java:8_jdk WORKDIR / RUN mkdir /build COPY . /build WORKDIR /build RUN mkdir /app RUN cp ./lib/machine-learning-models.jar /app/machine-learning-models.jar RUN bash gradlew shadowJar RUN cp ./build/libs/server-0.1-SNAPSHOT-all.jar /app/server.jar WORKDIR / RUN rm -rf /build EXPOSE 8000 ENTRYPOINT java -cp /app/machine-learning-models.jar:/app/server.jar com.company.Boot 

谢谢你的帮助!

看来最好的解决办法就是在容器外部build立脂肪JAR并COPY它。

我的最终解决scheme是使用与Java JRE捆绑的裸骨头Docker Alpine容器。 在构build时,我运行gradle shadowJar ,然后将JAR复制到容器中。

FROM anapsix/alpine-java:8_jre

根据@ mixja的回应,它本质上是一个“发布”的形象。

Docker为Dockerfile中的每个命令创build一个新层。 所以为了防止Docker做到这一点,你可以像这样聚合你的RUN命令:

 [...] WORKDIR /build RUN mkdir /app \ && cp ./lib/machine-learning-models.jar /app/machine-learning-models.jar \ && bash gradlew shadowJar \ && cp ./build/libs/server-0.1-SNAPSHOT-all.jar /app/server.jar WORKDIR / [...] 

注意\在每行的结束掩码换行符。

这样,Docker只为RUN-command创build一个层,不需要太多的磁盘空间。 看到这个答案的细节。

您应该单独构buildJAR(外部或在复制到本地FS的不同构build映像/容器中),然后将JAR文件复制到“释放”映像(现在只需要JRE而不是JDK)作为单个操作。