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

How to make Gradle cache persistent through Docker containers?

我有一个 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 文件夹在 gradle:6.8.3-jdk11 中设置为 VOLUME,这会阻止缓存保存在图像中。

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