是否可以自动创建AWS ECR存储库(如果尚不存在)。因为我使用了本地docker注册表实例,并在推送中自行创建了存储库。有没有办法用ECR进行配置
答案 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文章:
我们正在完全按照“创建构建规范”中的描述使用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对于tag
和push
操作很有用。
部分信用: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。