Ответ 1
один лайнер для создания репо, если он не существует:
aws ecr describe-repositories --repository-names ${REPO_NAME} || aws ecr create-repository --repository-name ${REPO_NAME}
Как я могу создать репозиторий AWS ECR, если он еще не существует?
один лайнер для создания репо, если он не существует:
aws ecr describe-repositories --repository-names ${REPO_NAME} || aws ecr create-repository --repository-name ${REPO_NAME}
Вы можете сделать это, но вам нужно сначала проверить, существует ли репо. Я взломал этот скрипт bash вместе, и он делает то, что мне нужно:
#!/bin/bash
aws ecr describe-repositories --repository-names $1 2>&1 > /dev/null
status=$?
if [[ ! "${status}" -eq 0 ]]; then
aws ecr create-repository --repository-name $1
fi
Аргументом будет какое-то имя репо. Чтобы это работало в CodeBuild, заданию потребуется роль IAM, которая позволяет ему создавать репозиторий ECR. Если вам нужно получить учетные данные AWS CLI в своей работе по сборке кода, ознакомьтесь с этим сообщением в блоге AWS:
Мы делаем именно то, что описано в разделе "Создание спецификации сборки", чтобы использовать JQ для извлечения учетных данных AWS.
Если вы хотите, чтобы это было автоматизировано в скрипте Jenkins, просто используйте этот фрагмент кода:
def ensureRegistry(accountId, region, repoName) {
Logger log = new Logger(this)
def accId = shell.output("aws --region ${region} ecr describe-repositories --repository-names \"${repoName}\" | jq .repositories[].registryId | tr -d '\"'")
if (accId == accountId) {
log.info("Docker repository ${repoName} exists for account ${accId}")
} else {
log.info("Docker repository ${repoName} doesn't exist for account ${accId}")
shell.status("aws --region ${region} ecr create-repository --repository-name \"${repoName}\"")
log.info("Docker repository ${repoName} was just created for account ${accId}")
}
}
shell.groovy
это:
def output(cmd) {
sh(script: cmd, returnStdout: true)
}
def status(cmd) {
sh(script: cmd, returnStatus: true)
}
Помимо условного создания репо, если вы также хотите извлечь URI репо, рассмотрите следующую многострочную команду bash:
REPO_URI=$(aws ecr describe-repositories --repository-names "${REPO_NAME}" --query "repositories[0].repositoryUri" --output text 2>/dev/null || \
aws ecr create-repository --repository-name "${REPO_NAME}" --query "repository.repositoryUri" --output text)
URI репо может быть полезен для операций tag
и push
.
Частичный кредит: ответ от JS
Вы можете использовать AWS CLI для создания репозиториев "на лету" и, возможно, поместить их в скрипт где-нибудь локально, если хотите.
aws --region REGION_NAME ecr create-repository --repository-name REPO_NAME --profile default
docker tag IMAGE_NAME AWS_ACCOUNT_ID.dkr.ecr.REGION_NAME.amazonaws.com/IMAGE_NAME
aws ecr get-login --no-include-email --region REGION_NAME --profile default
Это вернет большой ключ входа в ваш терминал, скопируйте его, а затем вставьте его в свой терминал и затем нажмите enter (Не лучший способ для безопасности!)
docker push AWS_ACCOUNT_ID.dkr.ecr.REGION_NAME.amazonaws.com/IMAGE_NAME
После этого перейдите в ECR, найдите свое репо и откройте его. Перейдите на вкладку "Разрешения", а затем примените политику, которая позволит другим ресурсам потреблять ее, если вам нужно.
Что касается автоматического создания репо при нажатии на изменения? Вы можете создать Repo CodeCommit и добавить это как триггер к изменению Codepipeline, которое будет выполнено, а затем выполнить команду buildspec.yml для выполнения команд AWS CLI.