'How to access gradle test reports from a docker container

I'm using a docker container to build and run my java application and I want to see the test results that would usually be available from build/reports/tests/test/index.html.

Here's my Dockerfile:

FROM alpine:latest

RUN apk add gradle openjdk17

WORKDIR /home/proj
COPY . .

RUN gradle build

ENTRYPOINT [ "java", "-jar", "./app/build/libs/app.jar" ]

Here's my docker-compose.yml:

version: "3.8"
services:
  app:
    build: .

I typically build my container with docker-compose build and run it with docker-compose up and would like this to stay as it is.

EDIT

I've tried changing my docker-compose.yml to:

version: "3.8"

services:
  app:
    build: .
    volumes:
      - ./tests:/home/proj/app/build/reports/tests/test

But this just creates an empty directory called tests in my project's root directory. I am 100% sure the right path is /home/proj/app/build/reports/tests/test as you can see here:

path



Solution 1:[1]

I've hit this same issue. Unfortunately volumes are only availible to docker run, they aren't part of the docker build portion of the docker compose process.

I even looked into the new RUN --mount=type=bind,source=.,target=./build/reports,rw gradle build and while in the container I can see (with a RUN ls ./build/reports) the reports being generated, but that mount (even as RW) only puts files in the container as a layer and they never appear on the host machine.

There is a hacky way to recover those test results, in the docker output, just above the failure you'll see this line ---> Running in f98e14dd1ee4. This is the layer ID, with that value you can copy from the failed layer to the local machine using

$ docker cp f98e14dd1ee4:/tmp/build/reports ./

$ ls reports/
checkstyle/ jacoco/     tests/

It shouldn't be to difficult to automate this kind of recover but it feels like it would be fragile automated.

I'm very interested if anyone has a better solution to this, even with an alternative to docker. I know I can build the container with gradle but I'd rather everything happens inside the container build process to keep the build environment defined as code.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Community