多模块maven项目和docker:找不到工件?

x33g5p2x  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(457)

我有以下几个阶段 dockerfile 它试图复制我的多模块的每个模块 java maven 项目和构建我的 ear 文件使用 mvn clean install .
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。

huus2vyu

huus2vyu1#

附属国 com.company.parent:jee6:pom:1.0.1-SNAPSHOT 似乎是私有的,docker build中的maven命令需要能够从私有存储库下载它,或者让它易于访问。
我假设这个问题是因为当尝试在maven docker映像中运行命令时,它看不到我的local.m2文件夹?
是的,那它就看不见你的眼睛了 settings.xml 使用私有存储库配置,或者本地依赖项(如果本地已有)。
复制my maven settings.xml也会有帮助吗?
最好不要:你的 settings.xml (以及其中的最终秘密)以后可能会提供给任何使用您的图像的人。在buildkit中使用秘密挂载是更好的解决方案(见下文)
您有多种解决方案:

在生成期间将settings.xml作为机密装载

此解决方案假设您有 settings.xml 配置了访问专用注册表的正确凭据。
使用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应该能够在构建期间下载父依赖项。
注意:这不是 COPY 使 settings.xml 在图像中,作为秘密 settings.xml 将仅对指定的生成步骤可用,并且不会保留在最终映像中。

复制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
qltillow

qltillow2#

错误有两个不同的部分:找不到父级,并且parent.relativepath元素错误。我想第二部分可能导致了第一部分。
由于父元素没有指定relativepath元素,因此默认值是模块父路径(aka..)。您的模块不在父文件夹(/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

相关问题