【问题标题】:Multi Module Maven Project and Docker: Cannot find artifact?多模块 Maven 项目和 Docker:找不到工件?
【发布时间】:2021-04-02 21:02:26
【问题描述】:

我有以下多阶段 dockerfile 尝试复制我的多模块 java maven 项目的每个模块并使用 mvn clean install 构建我的 ear 文件。

dockerfile:

# Copy files from local to maven image and build ear
FROM maven:3.5-jdk-8 AS build  
COPY module1 /usr/src/app/src  
COPY module2 /usr/src/app/src  
COPY module3 /usr/src/app/src  
COPY pom.xml /usr/src/app  
RUN mvn -f /usr/src/app/pom.xml clean install

# Create server image + rest of docker file (working ok)

我得到的错误如下:

Step 8/20 : RUN mvn -f /usr/src/app/pom.xml clean install
 ---> Running in cf9d8c1ef9ed
[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM for com.company.web:api:21.01-SNAPSHOT:
  Could not find artifact com.company.parent:jee6:pom:1.0.1-SNAPSHOT and
  'parent.relativePath' points at wrong local POM @ line 8, column 10
 @
[ERROR] The build could not read 1 project -> [Help 1]

pom.xml 中与此错误对应的部分:

<parent>
<groupId>com.company.parent</groupId>
<artifactId>jee6</artifactId>
<version>1.0.1-SNAPSHOT</version>
</parent>

我认为这个问题是因为当尝试在 maven docker 映像中运行命令时,它看不到我的本地 .m2 文件夹?它正在寻找的依赖是对我本地机器的私有依赖。

也可以复制我的 maven settings.xml 帮助吗?

我该如何解决这个问题?我不希望有人必须在他们的机器上安装 Maven 才能运行这个 dockerfile。

【问题讨论】:

    标签: java docker maven dependencies pom.xml


    【解决方案1】:

    依赖com.company.parent:jee6:pom:1.0.1-SNAPSHOT 似乎是私有的,您在 Docker 构建中的 Maven 命令需要能够从私有存储库下载它或使其易于访问。

    我认为这个问题是因为当尝试在 maven docker 映像中运行命令时,它看不到我的本地 .m2 文件夹?

    是的,它无法看到您的 settings.xml 与私有存储库配置,或本地依赖项(如果它已在本地可用)。

    也可以复制我的 maven settings.xml 帮助吗?

    最好不要:您的settings.xml(以及其中的最终秘密)可能会在以后使用您的图像的任何人使用。在 BuildKit 中使用秘密挂载会是更好的解决方案(见下文)


    您有多种解决方案:

    在构建过程中将settings.xml 挂载为秘密

    此解决方案假定您有一个 settings.xml configured with proper credentials to access private registry。

    使用Docker BuildKit 和--mount=secret 将settings.xml 加载为带有Dockerfile 的秘密,例如:

    # syntax=docker/dockerfile:1.2
    # Required comment at top of Dockerfile for using BuildKit
    
    FROM maven:3.5-jdk-8 AS build  
    
    COPY module1 /usr/src/app/src  
    COPY module2 /usr/src/app/src  
    COPY module3 /usr/src/app/src  
    COPY pom.xml /usr/src/app  
    
    # Use your secret settings.xml
    RUN --mount=type=secret,id=mvnsettings,target=/root/.m2/settings.xml \
      mvn -f /usr/src/app/pom.xml clean install
    

    并构建命令如:

    DOCKER_BUILDKIT=1 docker build --secret id=mvnsettings,src=$HOME/.m2/settings.xml . 
    

    Maven 应该能够在构建期间下载父依赖项。

    注意:这不是图像中的COPYsettings.xml,因为秘密settings.xml 仅可用于指定的构建步骤,并且不会保留在最终图像中。 em>

    在构建期间复制 com.company.parent:jee6 pom.xml

    这个解决方案不太实用,可能无法完全解决问题:

    • 需要在构建上下文中提供 com.company.parent:jee6:pom:1.0.1-SNAPSHOT pom.xml 文件
    • 您的父级pom.xml 可能引用其他私有依赖项。您必须以相同的方式包含它们。

    ...不过还是值得一试。

    你可以这样做:

    FROM maven:3.5-jdk-8 AS build  
    
    # Copy and install parent pom
    COPY parent-pom.xml /tmp/parent/pom.xml
    RUN mvn -f /tmp/parent/pom.xml clean install
    
    COPY module1 /usr/src/app/src  
    COPY module2 /usr/src/app/src  
    COPY module3 /usr/src/app/src  
    COPY pom.xml /usr/src/app  
    RUN mvn -f /usr/src/app/pom.xml clean install
    

    【讨论】:

      【解决方案2】:

      错误有 2 个不同的部分:找不到父级,以及 parent.relativePath 元素错误。我认为第二部分可能导致第一部分。

      由于您的父元素未指定 relativePath 元素,因此默认为模块父路径(又名 ..)。您的模块不在父文件夹 (/usr/src/app) 的子文件夹中,而是在 (/usr/src/app/src 子文件夹)。

      尝试将复制命令更改为:

      COPY module1 /usr/src/app
      COPY module2 /usr/src/app  
      COPY module3 /usr/src/app  
      COPY pom.xml /usr/src/app
      

      你应该会看到:

      /usr/src/app
      /usr/src/app/module1
      /usr/src/app/module2
      /usr/src/app/module3
      

      【讨论】:

      • 对不起,我现在仍然遇到同样的错误
      猜你喜欢
      • 2016-01-12
      • 2017-04-27
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 2012-09-18
      相关资源
      最近更新 更多