usbpc102
usbpc102

Reputation: 1257

How can you cache gradle inside docker?

I'm trying to cache things that my gradle build download each time currently. For that I try to mount a volume with the -v option like -v gradle_cache:/root/.gradle

The thing is each time I rerun the build with the exat same command it still downloads everything again. The full command I use to run the image is

sudo docker run --rm -v gradle_cache:/root/.gradle -v "$PWD":/home/gradle/project -w /home/gradle/project gradle:jdk8-alpine gradle jar

I also checked in the directory where docker saves the volumes content at /var/lib/docker/volumes/gradle_cache/_data but that is also empty.

my console log

What am I missing to make this working?

Edit: As per request I rerun the command with the --scan option.

And also with a diffrent gradle home:

$ sudo docker run --rm -v gradle_cache:/root/.gradle -v "$PWD":/home/gradle/project -w /home/gradle/project gradle:jdk8-alpine gradle jar --gradle-user-home /root/.gradle

FAILURE: Build failed with an exception.

* What went wrong:
Failed to load native library 'libnative-platform.so' for Linux amd64.

Upvotes: 7

Views: 10936

Answers (3)

ESV
ESV

Reputation: 7730

Since 6.2.1, Gradle now supports a shared, read-only dependency cache for this scenario:

It’s a common practice to run builds in ephemeral containers. A container is typically spawned to only execute a single build before it is destroyed. This can become a practical problem when a build depends on a lot of dependencies which each container has to re-download. To help with this scenario, Gradle provides a couple of options:

  • copying the dependency cache into each container

  • sharing a read-only dependency cache between multiple containers

https://docs.gradle.org/current/userguide/dependency_resolution.html#sub:ephemeral-ci-cache describes the steps to create and use the shared cache.

Upvotes: 3

EddardOmeka
EddardOmeka

Reputation: 173

Alternatively to have more control on the cache directory you can use this:

ENV GRADLE_USER_HOME /path/to/custom/cache/dir
VOLUME $GRADLE_USER_HOME

Upvotes: 2

usbpc102
usbpc102

Reputation: 1257

After looking at the Dockerfile for the Container I'm using I found out, that the right option to use is -v gradle_cache:/home/gradle/.gradle.

What made me think that the files were cached in /root/.gradle is that the Dockerfile also sets that up as a symlink from /home/gradle/.gradle:

ln -s /home/gradle/.gradle /root/.gradle

So inspecting the filesystem after a build made it look like the files were stored there.

Upvotes: 6

Related Questions