如何通过 Docker 容器使 Gradle 缓存持久化?

问题描述

我有一个 Java(Gradle) 项目。 docker 镜像是使用 Dockerfile 在 CI 中构建的:

FROM gradle:6.8.3-jdk11
copY --chown=gradle:gradle . /home/gradle/app
workdir /home/gradle/app
RUN gradle compileTestJava

虽然 gradle compileTestJava 会下载所有依赖项,但是当容器从镜像运行时,gradle 缓存变为空,所有依赖项都被重新下载。

如何将 gradle 缓存附加到图像以便在容器中使用它?

解决方法

Gradle 在 USER_HOME/.gradle 文件夹中缓存工件。 为此,您必须使用 Bind mountsVolumes 并将您的容器 $USER_HOME/.gradle 路径附加到该卷。

对于卷,

docker volume create <your_volume_name>

当运行你的容器时,像这样附加卷

docker run -v <your_volume_name>:USER_HOME/.gradle yourImage:tag

或者当你使用绑定挂载时,主机上的一个文件或目录被挂载到一个容器中。

docker run --mount type=bind,source=<your_host_path>,target=/USER_HOME/.gradle yourImage:tag
,

似乎 .gradle 文件夹被设置为 VOLUME 中的 gradle:6.8.3-jdk11,这会阻止缓存保存在图像中。

解决方案是创建一个没有卷的自定义基础 gradle 图像。