AWS ECR自动创建存储库(如果不存在)

时间:2018-06-25 17:12:08

标签: docker-registry aws-ecs aws-ecr

是否可以自动创建AWS ECR存储库(如果尚不存在)。因为我使用了本地docker注册表实例,并在推送中自行创建了存储库。有没有办法用ECR进行配置

9 个答案:

答案 0 :(得分:2)

您可以执行此操作,但是您需要先检查存储库是否存在。我一起破解了这个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 Blog文章:

https://aws.amazon.com/blogs/devops/how-to-create-an-ami-builder-with-aws-codebuild-and-hashicorp-packer/

我们正在完全按照“创建构建规范”中的描述使用JQ提取AWS凭证。

答案 1 :(得分:2)

一个衬里可创建一个回购(如果不存在):

aws ecr describe-repositories --repository-names ${REPO_NAME} || aws ecr create-repository --repository-name ${REPO_NAME}

答案 2 :(得分:0)

如果您希望在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)
}

答案 3 :(得分:0)

除了有条件地创建存储库外,如果您还想提取存储库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对于tagpush操作很有用。


部分信用:answer,由JS

答案 4 :(得分:0)

AWS仅在不存在存储库的情况下才进行存储。 您可以使用
忽略错误和失败 class Display: PrintSomething { func printMyname(name: String) { print(name) } } let display = Display() display.printMyname(name: "whatever") ,如果存在相同的存储库:

|| true

答案 5 :(得分:0)

export ECR_REPO=`aws ecr describe-repositories --repository-names $REPO_NAME 2>/dev/null | jq .repositories[0].repositoryUri | tr -d \\\" && aws ecr create-repository --repository-name $REPO_NAME --region us-east-1 2>/dev/null | jq .repository.repositoryUri | tr -d \\\"`

这在buildspec.yml文件中起作用,用于始终获取回购名称并将其存储在ECR_REPO变量中。它将创建存储库,或者如果存储库已经存在,则将以静默方式失败。如果确实存在,它将获取回购名称;如果不存在,它将默默地失败。

答案 6 :(得分:0)

要检查ECR存储库是否存在,可以使用double。首先检查描述存储库(如果不存在),然后创建存储库始终使用标签,这有助于审核。

- aws ecr describe-repositories --repository-names ${ECRImage} || aws ecr create-repository --repository-name ${ECRImage} --tags Key=Domain,Value=$Domain Key=AppEnv,Value=$AppEnv Key=ApplicationCI,Value=$ApplicationCI Key=Owner,Value=$Owner Key=Requester,Value=$Requester Key=CostCenter,Value=$CostCenter

答案 7 :(得分:0)

到目前为止,几乎所有答案都在调用describe-repositories,并且在发生错误的情况下,他们认为存储库不存在。 这是错误的,因为还会出现其他类型的错误(没有互联网连接,没有权限(AccessDeniedException),错误的回购名称,...)。

这意味着如果describe-repositories调用以错误结束,那么我们需要检查错误是否为RepositoryNotFoundException。只有在这种情况下,我们才应该呼叫create-repository

这是bash代码的样子:

output=$(aws ecr describe-repositories --repository-names ${REPO_NAME} 2>&1)

if [ $? -ne 0 ]; then
  if echo ${output} | grep -q RepositoryNotFoundException; then
    aws ecr create-repository --repository-name ${REPO_NAME}
  else
    >&2 echo ${output}
  fi
fi

逐行说明:

output=$(aws ecr describe-repositories --repository-names ${REPO_NAME} 2>&1)- 这将调用describe-repositories并将输出存储到名为output的变量。

if [ $? -ne 0 ]; then-此行检查上一个命令(aws ecs describe-repositories ...)是否不成功。如果退出代码($?)不为0(-ne 0),那么我们需要检查错误是什么。如果成功的话就没事了(成功意味着回购已经存在)。

if echo ${output} | grep -q RepositoryNotFoundException; then-在这一行中,我们正在检查是否由于存储库不存在而导致错误。如果是,那么我们需要创建存储库:

aws ecr create-repository --repository-name ${REPO_NAME}-创建存储库,我们知道它不存在。

else-其他情况意味着describe-repositories由于其他原因引发错误,然后不存在回购。

>&2 echo ${output}-在这种情况下,我们不应尝试创建存储库,而应在stderr(>&2)上输出错误

答案 8 :(得分:-3)

您可以使用AWS CLI快速创建存储库,也可以根据需要将其放置在本地脚本中。

app.yaml

这将在您的终端中返回一个大按键登录名,将其复制然后粘贴到您的终端中,然后按Enter(这不是确保安全的最佳方法!)

if/else

然后进入ECR,找到您的仓库并打开它。单击“权限”选项卡,然后应用一个策略,该策略将允许其他资源在需要时使用它。

就推送更改时自动创建存储库而言?您可以创建一个CodeCommit Repo并将其添加为要执行的Codepipeline更改的触发器,然后将其配置为执行那些AWS CLI命令的buildspec.yml。