Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do not download all Maven dependencies on a Docker build

Tags:

I'm trying to create a Dockerfile to then build a Maven project.

I wonder how to fix the Dockerfile and what command to then execute.

I would like to know how to run the build so that it does NOT download all the Maven dependencies every time it builds when the source code, sitting in the src/ directory, has NOT changed.

Here is my Dockerfile file:

FROM maven:3.3.9-jdk-8

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app

RUN cd /usr/src/app

ADD pom.xml /usr/src/app

RUN mvn dependency:resolve

ADD src /usr/src/app

RUN mvn package

ENTRYPOINT ["mvn"]
CMD ["package"]

Should I run the docker run --rm -it toolbox command or the docker build -t toolbox . command ?

Both of these above commands run fine, except that they both download all the Maven dependencies even if the source code has not been touched.

like image 921
Stephane Avatar asked Jul 10 '16 14:07

Stephane


People also ask

Does Docker image contain all dependencies?

A Docker image has many layers, and each image includes everything needed to configure a container environment -- system libraries, tools, dependencies and other files. Some of the parts of an image include: Base image.

Why Maven dependencies are not getting downloaded?

If you run Maven and it fails to download your required dependencies it's likely to be caused by your local firewall & HTTP proxy configurations. See the Maven documentation for details of how to configure the HTTP proxy.

Can a project have multiple Dockerfiles?

Introduction. Docker is a handy tool for containerization. It's so useful that sometimes, we want to have more than one Dockerfile in the project. Unfortunately, this goes against the straightforward convention of naming all Dockerfiles just “Dockerfile”.


1 Answers

That's how Docker works. Every time you do docker run, it creates a new container which does not have any access to the files in the old container. So, it download all dependencies it requires. You can circumvent this by declaring an external volume. Looking at the Dockerfile of Maven, it declares a volume /root/.m2. So, you can use a directory in your host machine and attach it to this volume by -v option. Your Docker command would be,

`docker run -v <directory-in-your-host>:/root/.m2 <other-options-and-commands>

Every time you run a new docker run, Maven will look into your local directory before downloading the dependency.

However, my question is why don't you build your app first and use the resulting jar to create the docker images unless you have any specific reasons. You can create your own Dockerfile using java base image or simply use one of the docker-maven-plugin like spotify available out there. That makes your life a lot easier.

like image 106
techtabu Avatar answered Nov 15 '22 05:11

techtabu