如何将 docker 映像指向我的 .m2 目录以在 mac 上的 docker 中运行 maven?

问题描述 投票:0回答:4

当您查看 Maven 构建的 Dockerfile 时,它包含以下行:

VOLUME /root/.m2

如果这是我的

.m2
存储库在我的 mac 上的位置,那就太好了 - 但它不是 - 它在

/Users/myname/.m2

现在我可以做:

但是 Docker 中的 linux 实现不知道要看那里。我想将 linux 位置映射到 mac 位置,并将其作为我的

vagrant init
的一部分。有点像:

ln /root/.m2 /Users/myname/.m2

我的问题是:如何将 docker 映像指向我的 .m2 目录以在 mac 上的 docker 中运行 maven?

linux macos maven docker vagrant
4个回答
10
投票

如何将 docker 镜像指向我的 .m2 目录以便在 mac 上的 docker 中运行 maven?

您宁愿将主机文件夹(如 /Users/myname/.m2)指向 container 文件夹(不是图像)

参见《将主机目录挂载为数据卷》:

除了使用

-v
标志创建卷外,您还可以 从 Docker 守护进程的主机中将目录挂载到容器中

$ docker run -d -P --name web -v /Users/myname/.m2:/root/.m2 training/webapp python app.py

此命令将主机目录

/Users/myname/.m2
挂载到位于
/root/.m2
的容器中。
如果路径
/root/.m2
已经存在于容器的图像中,
/Users/myname/.m2
挂载覆盖但不会删除预先存在的内容。
一旦支架被移除,内容就可以再次访问了。
这与 mount 命令的预期行为一致。


9
投票

要在构建步骤中共享 .m2 文件夹,您可以覆盖 settings.xml 中的 localRepository 值。

这是我用来在 docker 中共享本地 .m2 存储库的 Dockerfile 片段。

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"]

2
投票

这里是包含一个 spring 服务和任何其他服务的示例项目的 Dockerfiles 和 docker-compose;

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"

在 docker-compose 中,我们为本地 .m2 存储库和容器 one 制作卷。


0
投票

我使用

maven:3-amazoncorretto-17
作为我的基础图像。

使用 Arun A 的答案中的一些信息,我能够想出一个非常简单的解决方案。棘手的部分(对我来说)是弄清楚 settings.xml 需要放在容器内的什么位置。此外,这个例子只是安装settings.xml

.

使用

docker-compose

volumes: - "~/.m2/settings.xml:/usr/share/maven/conf/settings.xml"
或者

docker run -v


$ docker run -v ~/.m2/settings.xml:/usr/share/maven/conf/settings.xml maven:3-amazoncorretto-17
此语法应适用于 Windows 和 Mac。

© www.soinside.com 2019 - 2024. All rights reserved.