Многомодульный проект Maven и Docker: не удается найти артефакт?

У меня есть следующий многоэтапный dockerfile, который пытается скопировать каждый модуль моего многомодульного java maven проекта и построить мой ear файл, используя mvn clean install.

докерфайл:

# 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 она не видит мою локальную папку .m2? И зависимость, которую он ищет, является частной зависимостью от моей локальной машины.

Также поможет копирование моего maven settings.xml?

Как я могу решить эту проблему? Я не хочу, чтобы кому-то нужно было установить Maven на свою машину, чтобы запустить этот файл докеров.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
0
2 865
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В ошибке есть две разные части: не удается найти родителя и неправильный элемент parent.relativePath. Я думаю, что 2-я часть может быть причиной 1-й.

Поскольку ваш родительский элемент не указывает элемент 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

Извините, я все еще получаю ту же ошибку сейчас

java12399900 24.12.2020 19:07
Ответ принят как подходящий

Зависимость com.company.parent:jee6:pom:1.0.1-SNAPSHOT кажется частной, ваша команда Maven внутри сборки Docker должна иметь возможность либо загрузить ее из частного репозитория, либо сделать ее легкодоступной.

Я предполагаю эту проблему, потому что при попытке запустить команду в образе докера maven она не видит мою локальную папку .m2?

Да, тогда он не сможет увидеть ваш settings.xml с конфигурацией частного репозитория или локальную зависимость, если она уже доступна локально.

Поможет ли также копирование моего файла 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:jee6pom.xml во время сборки

Это решение менее практично и может не решить проблему полностью:

  • Потребуется иметь файл com.company.parent:jee6:pom:1.0.1-SNAPSHOTpom.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

Другие вопросы по теме