Я пытаюсь создать свой проект с помощью Docker, у него есть некоторые API-интерфейсы REST Java, я использую Maven и Spring Boot в мультисервисной архитектуре. У меня есть «ведомый» модуль под названием «common-utilities», в нем есть все общие сущности и некоторые необходимые мне утилиты календаря, и этот модуль используется как зависимость от всех других моих модулей.
У меня возникла проблема, когда Docker не мог выполнить сборку, поскольку он не находит мой собственный подчиненный модуль в качестве зависимости для другого, поскольку он ищет его в Maven Central, после некоторых поисков я обнаружил, что могу скопировать вручную папка .jar этой зависимости для сборки Docker .m2, но это решение меня не устраивает. Затем я обнаружил, что могу загрузить подчиненный модуль .jar в частный репозиторий, попробовал Nexus, но, поскольку скоро буду использовать AWS, я перешел на AWS Code Artifact.
Теперь проблема в том, как установить токен вне инфраструктуры AWS, который нужен моему settings.xml для загрузки этой зависимости?




После долгих поисков я нашел способ сделать это. Я попробовал команду RUN, но поскольку ее выполнение не может сохранить результат в полезную переменную, которую можно было бы захватить с помощью settings.xml, мне пришлось применить другой подход.
Это мой Dockerfile:
###############################################################
# Build stage
# Maven image to build the application
FROM maven:3.9.6-amazoncorretto-17-al2023 AS build-stage
# Creating the directory
RUN mkdir -p /usr/src/app
# Setting the working directory.
WORKDIR /usr/src/app
# Adding the source code to the build stage.
ADD . /usr/src/app
# And here comes the Amazon configuration step!
RUN yum install aws-cli -y
RUN aws configure set aws_access_key_id 'YOUR KEY'
RUN aws configure set aws_secret_access_key 'YOUR SECRET ACCESS KEY'
RUN aws configure set aws_region 'YOUR REGION'
RUN aws configure set aws_output_format json
# Then I execute the command to get Code Artifact's token and save it into a file called "result" located in "./"
RUN aws codeartifact get-authorization-token --domain YOUR-DOMAIN --domain-owner YOUR-OWNER-ID --region YOUR-REGION --query authorizationToken --output text >> ./result
# So now I execute the maven install command passing the settings.xml WITH the property "token", which is a cat command to read from the file that has the token and to be used inside the XML file.
RUN mvn -Dtoken=${cat ./result} -s settings.xml install -U
###############################################################
# Production step. Now it's done, it works!
FROM openjdk:17-alpine AS production-stage
COPY --from=build-stage /usr/src/app/target/*.jar my-api.jar
EXPOSE 8788
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-Xmx256m", "-Xms128m", "-jar", "my-api.jar"]
А это мой settings.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<settings xmlns = "http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/SETTINGS/1.2.0
https://maven.apache.org/xsd/settings-1.2.0.xsd">
<servers>
<server>
<id>domain-name</id>
<username>aws</username>
<password>${token}</password>
</server>
</servers>
<profiles>
<profile>
<id>domain-name</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>domain-name</id>
<url>repo-url</url>
</repository>
</repositories>
</profile>
</profiles>
</settings>
Я не уверен, что это правильно, но это работает!! Поэтому я хотел поделиться этой информацией с вами, ребята, потому что, ради любви к себе, я не смог найти никакой информации о том, как это сделать.