Как настроить AWS ECS + dockerfile-maven-plugin?
Я пытаюсь настроить свой проект pom.xml
и мавен settings.xml
автоматизировать процесс создания образа Docker и отправки его в мой частный репозиторий AWS ECS.
В моем pom.xml
Я добавил dockerfile-maven-plugin и настроил его следующим образом:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>myproject/server</finalName>
<repository>137037344249.dkr.ecr.us-east-2.amazonaws.com/myproject/server</repository>
<tag>${docker.image.tag}</tag>
<serverId>ecs-docker</serverId>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
<buildArgs>
<VERSION>${project.version}</VERSION>
<BUILD_NUMBER>${buildNumber}</BUILD_NUMBER>
<WAR_FILE>${project.build.finalName}.war</WAR_FILE>
</buildArgs>
</configuration>
</plugin>
В соответствии с инструкциями dockerfile-maven-plugin, мне нужно добавить конфигурации для аутентификации на моем сервере ECS, но я не знаю, какое имя пользователя / пароль мне нужно предоставить. Я сомневаюсь, что это мой логин / пароль пользователя AWS.
<servers>
<server>
<id>ecs-docker</id>
<username>where_to_get_this</username>
<password>where_to_get_this</password>
</server>
</servers>
Также приветствуются любые предложения по автоматизации генерации / переноса этого образа Docker в мой репозиторий.
2 ответа
Чтобы создать образ докера и передать его в AWS ECR с помощью Spotify dockerfile-maven-plugin, необходимо:
- устанавливать
amazon-ecr-credential-helper
go get -u github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login
- Переместите его в папку, которая уже находится в пути выполнения:
mv ~/go/bin/docker-credential-ecr-login ~/bin/
- добавлять
credHelpers
раздел к~/.docker/config.json
файл для нашего идентификатора хранилища Amazon ECR:
{
"credHelpers": {
"<ecr-id>.dkr.ecr.<aws-region>.amazonaws.com": "ecr-login"
},
//...
}
(в Windows удалите строку "credsStore": "wincred",
, если он существует, из этого файла)
- Проверь это
~/.aws/config
есть ваш регион
[default]
region = <aws-region>
а также ~/.aws/credentials
есть наши ключи
[ecr-push-user]
aws_access_key_id = <id>
aws_secret_access_key = <secret>
( Подробнее...)
- Добавить Spotify
dockerfile-maven-plugin
в pom.xml:
<properties>
<docker.image.prefix>xxxxxxxxxxxx.dkr.ecr.rrrrrrr.amazonaws.com</docker.image.prefix>
<docker.image.name>${project.artifactId}</docker.image.name>
<docker.image.tag>${project.version}</docker.image.tag>
<docker.file>Dockerfile</docker.file>
</properties>
<build>
<finalName>service</finalName>
<plugins>
<!-- Docker image mastering -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.10</version>
<configuration>
<repository>${docker.image.prefix}/${docker.image.name}</repository>
<tag>${docker.image.tag}</tag>
<dockerfile>${docker.file}</dockerfile>
</configuration>
<executions>
<execution>
<id>default</id>
<phase>package</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- Убедитесь, что Dockerfile существует, например:
FROM openjdk:11-jre-slim
VOLUME /tmp
WORKDIR /service
COPY target/service.jar service.jar
ENTRYPOINT exec java -server \
-Djava.security.egd=file:/dev/./urandom \
$JAVA_OPTS \
-jar service.jar
- Создайте и нажмите на изображение с помощью одной команды:
mvn package
Чтобы войти в ECR, вы должны использовать командную строку AWS, чтобы сгенерировать команду входа в docker, а затем войти в нее с помощью вашего демона docker. Я не думаю, что этот вариант использования обрабатывается любым плагином Docker Maven.
Что я делаю в своем проекте, так это войдите в систему моего демона Docker, прежде чем делать push:
logstring=`aws --profile my-aws-profile ecr get-login --registry-ids my-registry-id`
`$logstring`
Этот ручной шаг необходим в моем случае, потому что у нас есть одна учетная запись AWS, которая защищена аппаратным токеном, генерирующим однократные коды использования, но это не проблема, поскольку нам нужно делать это только один раз в день (вход в систему ECR продолжается в течение 12 часов), в дни, когда мы используем ECR (в отличие от тех, в которых мы проводим локальные испытания).
Итак, решения:
- Авторизуйтесь вручную в ECR, чтобы ваш докер работал без необходимости входа из maven.
- Добавьте шаг входа в систему, который записывает внешний логин прямо в вашем pom
- Попробуйте AWS CodePipeline для создания кода непосредственно при фиксации и развертывания в ECR (что я рекомендую, если у вас нет других ограничений)
Повеселись!
Я ничего не настраивал в моем файле настроек maven. Я обычно авторизируюсь с помощью команды ниже
$(aws ecr get-login --no-include-email --region my-region)
затем я запускаю команды maven (команды docker встроены как часть целей maven), и все работает нормально.
Для справки: это моя настройка файла pom с использованием плагина Docker.
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
<dockerDirectory>docker</dockerDirectory>
<!-- <serverId>docker-hub</serverId> -->
<registryUrl>https://${docker.image.prefix}</registryUrl>
<forceTags>true</forceTags>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
<executions>
<execution>
<id>tag-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>push-image</id>
<phase>deploy</phase>
<goals>
<goal>push</goal>
</goals>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
</configuration>
</execution>
</executions>
</plugin>