如何通过 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 mounts
或 Volumes
并将您的容器 $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 图像。
我有一个 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 mounts
或 Volumes
并将您的容器 $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 图像。