У меня есть следующий многоэтапный 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 на свою машину, чтобы запустить этот файл докеров.
В ошибке есть две разные части: не удается найти родителя и неправильный элемент 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
Зависимость 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: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
Извините, я все еще получаю ту же ошибку сейчас