How do I point a docker image to my .m2 directory for running maven in docker on a mac?
Solution 1
How do I point a docker image to my .m2 directory for running maven in docker on a mac?
You rather point a host folder (like /Users/myname/.m2) to a container folder (not an image)
See "Mount a host directory as a data volume":
In addition to creating a volume using the
-v
flag you can also mount a directory from your Docker daemon’s host into a container.
$ docker run -d -P --name web -v /Users/myname/.m2:/root/.m2 training/webapp python app.py
This command mounts the host directory,
/Users/myname/.m2
, into the container at/root/.m2
.
If the path/root/.m2
already exists inside the container’s image, the/Users/myname/.m2
mount overlays but does not remove the pre-existing content.
Once the mount is removed, the content is accessible again.
This is consistent with the expected behavior of the mount command.
Solution 2
To share the .m2 folder in build step you can overwrite the localRepository value in settings.xml.
Here is the Dockerfile snippet I used to share my local .m2 repository in docker.
FROM maven:3.5-jdk-8 as BUILD
RUN echo \
"<settings xmlns='http://maven.apache.org/SETTINGS/1.0.0\' \
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' \
xsi:schemaLocation='http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd'> \
<localRepository>/root/Users/myname/.m2/repository</localRepository> \
<interactiveMode>true</interactiveMode> \
<usePluginRegistry>false</usePluginRegistry> \
<offline>false</offline> \
</settings>" \
> /usr/share/maven/conf/settings.xml;
COPY . /usr/src/app
RUN mvn --batch-mode -f /usr/src/app/pom.xml clean package
FROM openjdk:8-jre
EXPOSE 8080 5005
COPY --from=BUILD /usr/src/app/target /opt/target
WORKDIR /opt/target
ENV _JAVA_OPTIONS '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'
ENV swarm.http.port 8080
CMD ["java", "-jar", "app-swarm.jar"]
Solution 3
Here are the Dockerfiles and docker-compose for example project containing one spring service and any other services;
Spring-service dockerfile
FROM maven:3.5-jdk-8-alpine
WORKDIR /app
COPY . src
CMD cd src ; mvn spring-boot:run
docker-compose.yml
version: '3'
services:
account-service:
build:
context: ./
dockerfile: Dockerfile
ports:
- "8080:8080"
volumes:
- "${HOME}/.m2:/root/.m2"
Here in docker-compose we make volumes for our local .m2 repo and container one.
user1544101
Updated on March 04, 2020Comments
-
user1544101 about 4 years
When you look at the Dockerfile for a maven build it contains the line:
VOLUME /root/.m2
Now this would be great if this is where my
.m2
repository was on my mac - but it isn't - it's in/Users/myname/.m2
Now I could do:
But then the linux implementation in Docker wouldn't know to look there. I want to map the linux location to the mac location, and have that as part of my
vagrant init
. Kind of like:ln /root/.m2 /Users/myname/.m2
My question is: How do I point a docker image to my .m2 directory for running maven in docker on a mac?
-
quit over 7 yearsBy some reasons this not working for me. In build stage maven still download dependencies... Any suggestions?
-
VonC over 7 yearsYes, I would like to know more: what host OS, image OS, maven version are you using? Could you detail those information in a new question?
-
quit about 7 yearsIt is just docker cant share volumes while build. Just in run, github.com/docker/docker/issues/14080
-
OneCricketeer almost 3 yearsVery confusing why you're mounting a Maven folder and running a Python script :) In any case, wouldn't this cause permissions issues when maven (eventually) downloads and writes files within the volume as its uid/gid?)
-
OneCricketeer almost 3 yearsYou should consider not using
mvn
to run the app. The JDK isn't needed, and this causes larger image sizes -
OneCricketeer almost 3 yearsYou must still be mounting a volume here to make
/root/Users/myname/
work within the container? You also don't need a "target" folder for a JAR to be ran -
VonC almost 3 years@OneCricketeer like any mounted folder, you must make sure your image uses the right uid/gid if it intent to persist data in said mounted folder indeed.