我试图从我的DockerFile构建一个Docker镜像,但不断得到一个错误,比如它找不到父pom.xml
来执行docker文件中的maven命令并构建项目。我一直在四处寻找,你会发现人们所做的是添加到子pom.xml
,引用父pom.xml,y尝试添加一个relativePath>.. /pom.xml/relativePath>
到子,但仍然不起作用。
Maven-multimodule项目
[
DockerFile
FROM alpine/git as clone
WORKDIR /app
RUN git clone https://github.com/RicardoVargasLeslie/manager.git
FROM openjdk:8-jdk-alpine as build
WORKDIR /workspace/app
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
COPY src src
RUN ./mvnw install -DskipTests
ENTRYPOINT ["java","-jar","/Web-0.0.1-SNAPSHOT.jar"]
字符串
Child-pom.xml(Web)
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.imricki.manager</groupId>
<artifactId>core</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>Web</artifactId>
<name>Web</name>
<description>Web Module</description>
型
Parent-pom.xml(Core)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.imricki.manager</groupId>
<artifactId>core</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Core</name>
<description>Core Module</description>
<packaging>pom</packaging>
型
Docker命令构建镜像
docker build -t rest-api .
型
命令行跟踪
$ docker build -t rest-api .
Sending build context to Docker daemon 42.92MB
Step 1/11 : FROM alpine/git as clone
---> a1d22e4b51ad
Step 2/11 : WORKDIR /app
---> Using cache
---> e53f5b4941b5
Step 3/11 : RUN git clone https://github.com/RicardoVargasLeslie/manager.git
---> Using cache
---> 490b2afea22c
Step 4/11 : FROM openjdk:8-jdk-alpine as build
---> a3562aa0b991
Step 5/11 : WORKDIR /workspace/app
---> Using cache
---> 0b7c106319e9
Step 6/11 : COPY mvnw .
---> Using cache
---> 2c7ab0b79d25
Step 7/11 : COPY .mvn .mvn
---> Using cache
---> eb9ec36b737a
Step 8/11 : COPY pom.xml .
---> Using cache
---> 2296a5fbd6ae
Step 9/11 : COPY src src
---> Using cache
---> 022a609f4376
Step 10/11 : RUN ./mvnw install -DskipTests
---> Running in 897cff2e3c3b
[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM for com.imricki.manager:Web:[unknown-version]: Could not find artifact com.imricki.manager:core:pom:0.0.1-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 5, column 10
@
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]
[ERROR] The project com.imricki.manager:Web:[unknown-version] (/workspace/app/pom.xml) has 1 error
[ERROR] Non-resolvable parent POM for com.imricki.manager:Web:[unknown-version]: Could not find artifact com.imricki.manager:core:pom:0.0.1-SNAPSHOT and 'parent.relativePath' points at wrong local POM @ line 5, column 10 -> [Help 2]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException
The command '/bin/sh -c ./mvnw install -DskipTests' returned a non-zero code: 1
型
我不知道什么是错误的或如何使建设工作,谢谢任何帮助。
2条答案
按热度按时间nlejzf6q1#
Maven是一个工具,它支持一种声明式的方式来管理项目的依赖项。它通过标准化项目共享jar和pom文件(工件)的方式来实现这一点,并使用maven坐标来声明项目依赖关系(groupId,artifactId和version),然后在名为Maven Central的jar和pom文件的大型公共maven存储库中查找。
为了让你的jar/pom文件(比如你的core)作为一个maven工件进行管理,你需要将你的工件部署到Maven Central(任何人都可以访问的公共存储库)或者你的私有网络中的某个私有存储库(甚至在互联网上,可能需要进行身份验证)。对于私有存储库,您需要包括您的私有存储库,以便您的maven执行不仅在Maven Central中查找工件,而且在您的私有存储库中查找工件。您可以通过将以下内容添加到
settings.xml
文件来实现此目的:字符串
我注意到您的子
pom.xml
文件引用了一个自定义父模块。你需要确保你的父模块在一个maven存储库(Nexus/Artifactory)中,并且你提供了一个settings.xml
文件,其中包含Docker容器的存储库设置,以便能够拉取父pom。epfja78i2#
在我的情况下,我得到这是由于事实,显然Dockerfile指令作为副本不能看到父文件夹!
意思是如果你有一个结构:
字符串
模块中的Dockerfiles无法执行以下操作:
型
因为它无法访问localSystem“..”!!解决方案是将Dockerfiles移动到父文件夹,如下所示:
型
然后我就做了这样的事情:
型
我花了很多时间才弄明白这一点,我需要在没有运行maven的情况下使用COPY指令创建一个容器,然后我钻到容器文件中,发现pom父级没有被复制,实际上docker以某种方式复制了子pom作为这个指令的父级pom:
型
所以你应该知道,在构建docker时,你不能从localMachine的父文件夹复制文件,因为它没有访问权限。并且它将在当前文件夹上执行相同的命令,这使得它很难检测到,因为没有错误被抛出到它的场景。