How to access gradle test reports from a docker container

Viewed 316

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

1 Answers

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.

Related