Создайте Dockerfile с помощью Java и maven с зависимостью CodeArtifact

Я пытаюсь создать свой проект с помощью Docker, у него есть некоторые API-интерфейсы REST Java, я использую Maven и Spring Boot в мультисервисной архитектуре. У меня есть «ведомый» модуль под названием «common-utilities», в нем есть все общие сущности и некоторые необходимые мне утилиты календаря, и этот модуль используется как зависимость от всех других моих модулей.

У меня возникла проблема, когда Docker не мог выполнить сборку, поскольку он не находит мой собственный подчиненный модуль в качестве зависимости для другого, поскольку он ищет его в Maven Central, после некоторых поисков я обнаружил, что могу скопировать вручную папка .jar этой зависимости для сборки Docker .m2, но это решение меня не устраивает. Затем я обнаружил, что могу загрузить подчиненный модуль .jar в частный репозиторий, попробовал Nexus, но, поскольку скоро буду использовать AWS, я перешел на AWS Code Artifact.

Теперь проблема в том, как установить токен вне инфраструктуры AWS, который нужен моему settings.xml для загрузки этой зависимости?

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

Ответы 1

Ответ принят как подходящий

После долгих поисков я нашел способ сделать это. Я попробовал команду 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>

Я не уверен, что это правильно, но это работает!! Поэтому я хотел поделиться этой информацией с вами, ребята, потому что, ради любви к себе, я не смог найти никакой информации о том, как это сделать.

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