将本地 Docker 客户端登录到一个或多个 Amazon ECR 私有注册表或 Amazon ECR 公共注册表。
目录
在此操作的新主要版本中, mask-password
输入的默认值已从false
更改为true
。
如果您不使用 Docker 凭证作为后续作业的输出,则只需将操作版本更新为aws-actions/amazon-ecr-login@v2
。
对于在后续作业中使用 Docker 凭证作为输出的任何客户:
mask-password
输入的默认值(当前在 v1 中为false
,则升级到 v2 时您的工作流程将中断。要解决此问题,请将掩码密码输入设置为false
: - name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
with:
mask-password: 'false'
mask-password
输入设置为false
,则只需将操作版本更新为aws-actions/amazon-ecr-login@v2
。有关进行此更改的原因的更多信息,请参阅在 Amazon ECR 登录操作中屏蔽 Docker 凭证。
- name : Checkout repo
uses : actions/checkout@v3
- name : Configure AWS credentials
uses : aws-actions/configure-aws-credentials@v4 # More information on this action can be found below in the 'AWS Credentials' section
with :
role-to-assume : arn:aws:iam::123456789012:role/my-github-actions-role
aws-region : aws-region-1
- name : Login to Amazon ECR
id : login-ecr
uses : aws-actions/amazon-ecr-login@v2
- name : Build, tag, and push docker image to Amazon ECR
env :
REGISTRY : ${{ steps.login-ecr.outputs.registry }}
REPOSITORY : my-ecr-repo
IMAGE_TAG : ${{ github.sha }}
run : |
docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG .
docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG
- name : Login to Amazon ECR Public
id : login-ecr-public
uses : aws-actions/amazon-ecr-login@v2
with :
registry-type : public
- name : Build, tag, and push docker image to Amazon ECR Public
env :
REGISTRY : ${{ steps.login-ecr-public.outputs.registry }}
REGISTRY_ALIAS : my-ecr-public-registry-alias
REPOSITORY : my-ecr-public-repo
IMAGE_TAG : ${{ github.sha }}
run : |
docker build -t $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG .
docker push $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG
- name : Login to Amazon ECR
id : login-ecr
uses : aws-actions/amazon-ecr-login@v2
- name : Package and push helm chart to Amazon ECR
env :
REGISTRY : ${{ steps.login-ecr.outputs.registry }}
REPOSITORY : my-ecr-repo
run : |
helm package $REPOSITORY
helm push $REPOSITORY-0.1.0.tgz oci://$REGISTRY
- name : Login to Amazon ECR Public
id : login-ecr-public
uses : aws-actions/amazon-ecr-login@v2
with :
registry-type : public
- name : Package and push helm chart to Amazon ECR Public
env :
REGISTRY : ${{ steps.login-ecr-public.outputs.registry }}
REGISTRY_ALIAS : my-ecr-public-registry-alias
REPOSITORY : my-ecr-public-repo
run : |
helm package $REPOSITORY
helm push $REPOSITORY-0.1.0.tgz oci://$REGISTRY/$REGISTRY_ALIAS
Helm 使用与 Docker 相同的凭据存储,因此 Helm 可以使用与 Docker 使用的相同凭据进行身份验证。
- name : Configure AWS credentials
uses : aws-actions/configure-aws-credentials@v4
with :
role-to-assume : arn:aws:iam::123456789012:role/my-github-actions-role
aws-region : aws-region-1
- name : Login to Amazon ECR
id : login-ecr
uses : aws-actions/amazon-ecr-login@v2
with :
registries : " 123456789012,998877665544 "
账户998877665544
上的存储库需要显式授予对角色的访问权限: arn:aws:iam::123456789012:role/my-github-actions-role
才能进行跨账户访问
有关如何配置 ECR 策略的详细信息,请参阅 AWS 文档
使用该操作输出用于登录 ECR Private 的 Docker 凭据,然后使用该凭据将您的私有映像作为另一个作业中的服务运行。
警告
如果启用了调试日志记录,则将mask-password
设置为'false'
将记录您的 Docker 密码输出。有关更多信息,请参阅下面的 Docker 凭证部分。
jobs :
login-to-amazon-ecr :
runs-on : ubuntu-latest
steps :
- name : Configure AWS credentials
uses : aws-actions/configure-aws-credentials@v4
with :
role-to-assume : arn:aws:iam::123456789012:role/my-github-actions-role
aws-region : us-east-1
mask-aws-account-id : ' false '
- name : Login to Amazon ECR
id : login-ecr
uses : aws-actions/amazon-ecr-login@v2
with :
mask-password : ' false '
outputs :
registry : ${{ steps.login-ecr.outputs.registry }}
docker_username : ${{ steps.login-ecr.outputs.docker_username_123456789012_dkr_ecr_us_east_1_amazonaws_com }} # More information on these outputs can be found below in the 'Docker Credentials' section
docker_password : ${{ steps.login-ecr.outputs.docker_password_123456789012_dkr_ecr_us_east_1_amazonaws_com }}
run-with-internal-service :
name : Run something with an internal image as a service
needs : login-to-amazon-ecr
runs-on : ubuntu-latest
services :
internal-service :
image : ${{ needs.login-to-amazon-ecr.outputs.registry }}/my-ecr-repo:latest
credentials :
username : ${{ needs.login-to-amazon-ecr.outputs.docker_username }}
password : ${{ needs.login-to-amazon-ecr.outputs.docker_password }}
ports :
- ' 80:80 '
steps :
- name : Run steps in container
run : echo "run steps in container"
有关此操作的输入和输出的完整文档,请参阅 action.yml。
此操作依赖于 AWS SDK for Javascript 的默认行为来确定 AWS 凭证和区域。使用aws-actions/configure-aws-credentials
操作使用 GitHub 的 OIDC 提供程序和您所需的区域来配置具有角色的 GitHub Actions 环境。
- name : Configure AWS credentials
uses : aws-actions/configure-aws-credentials@v4
with :
role-to-assume : arn:aws:iam::123456789012:role/my-github-actions-role
aws-region : us-east-1
- name : Login to Amazon ECR Private
id : login-ecr
uses : aws-actions/amazon-ecr-login@v2
我们建议在 GitHub Actions 工作流程中使用 AWS 服务时遵循 Amazon IAM 最佳实践,包括:
aws-actions/configure-aws-credentials
操作中的示例 IAM 角色 CloudFormation 模板以获取示例。ECR Private 和 ECR Public 的注册表 URI 如下:
123456789012.dkr.ecr.aws-region-1.amazonaws.com
public.ecr.aws
登录后,您可以使用以下格式通过操作输出访问 docker 用户名和密码:
如果使用 ECR Private:
docker_username_123456789012_dkr_ecr_aws_region_1_amazonaws_com
docker_password_123456789012_dkr_ecr_aws_region_1_amazonaws_com
如果使用 ECR 公共:
docker_username_public_ecr_aws
docker_password_public_ecr_aws
重要的
如果您不使用 Docker 凭证输出,请确保mask-password
输入未设置或设置为'true'
。如果启用调试日志记录,这会屏蔽您的 Docker 密码并防止将其打印到操作日志中。
如果您使用 Docker 凭证输出,请确保mask-password
输入设置为'false'
。屏蔽值无法传递给单独的作业(请参阅此问题)。
如果您在自托管环境和/或需要使用特定代理的安全环境中运行,则可以在操作中手动设置它。
此外,此操作将始终考虑环境中已配置的代理。
通过操作输入配置代理:
uses : aws-actions/amazon-ecr-login@v2
with :
http-proxy : " http://companydomain.com:3128 "
通过环境变量配置代理:
# Your environment configuration
HTTP_PROXY= " http://companydomain.com:3128 "
该操作将从环境中读取底层代理配置,您不需要在操作中对其进行配置。
要了解如何以及在何处实施以下权限,请参阅 Amazon ECR 用户指南中的 IAM 部分。
此操作需要以下最低权限集才能登录 ECR Private:
{
"Version" : " 2012-10-17 " ,
"Statement" : [
{
"Sid" : " GetAuthorizationToken " ,
"Effect" : " Allow " ,
"Action" : [
" ecr:GetAuthorizationToken "
],
"Resource" : " * "
}
]
}
GitHub Actions 工作流程中的 Docker 命令(例如docker pull
和docker push
)可能需要附加到此操作使用的凭据的附加权限。
从 ECR 私有存储库提取映像需要以下最低权限:
{
"Version" : " 2012-10-17 " ,
"Statement" : [
{
"Sid" : " AllowPull " ,
"Effect" : " Allow " ,
"Action" : [
" ecr:BatchGetImage " ,
" ecr:GetDownloadUrlForLayer "
],
"Resource" : " arn:aws:ecr:us-east-1:123456789012:repository/my-ecr-repo "
}
]
}
在 ECR 私有存储库中推送和拉取映像需要以下最低权限:
{
"Version" : " 2012-10-17 " ,
"Statement" : [
{
"Sid" : " AllowPushPull " ,
"Effect" : " Allow " ,
"Action" : [
" ecr:BatchGetImage " ,
" ecr:BatchCheckLayerAvailability " ,
" ecr:CompleteLayerUpload " ,
" ecr:GetDownloadUrlForLayer " ,
" ecr:InitiateLayerUpload " ,
" ecr:PutImage " ,
" ecr:UploadLayerPart "
],
"Resource" : " arn:aws:ecr:us-east-1:123456789012:repository/my-ecr-repo "
}
]
}
要了解如何以及在何处实施以下权限,请参阅 Amazon ECR 公共用户指南中的 IAM 部分。
此操作需要以下最低权限集才能登录 ECR Public:
{
"Version" : " 2012-10-17 " ,
"Statement" : [
{
"Sid" : " GetAuthorizationToken " ,
"Effect" : " Allow " ,
"Action" : [
" ecr-public:GetAuthorizationToken " ,
" sts:GetServiceBearerToken "
],
"Resource" : " * "
}
]
}
GitHub Actions 工作流程中的 Docker 命令(例如docker push
)可能需要附加到此操作使用的凭据的附加权限。从 ECR Public 提取图像不需要任何权限。
将映像推送到 ECR 公共存储库需要以下最低权限:
{
"Version" : " 2012-10-17 " ,
"Statement" : [
{
"Sid" : " AllowPush " ,
"Effect" : " Allow " ,
"Action" : [
" ecr-public:BatchCheckLayerAvailability " ,
" ecr-public:CompleteLayerUpload " ,
" ecr-public:InitiateLayerUpload " ,
" ecr-public:PutImage " ,
" ecr-public:UploadLayerPart "
],
"Resource" : " arn:aws:ecr-public::123456789012:repository/my-ecr-public-repo "
}
]
}
Inaccessible host: 'api.ecr-public.aws-region-1.amazonaws.com' at port 'undefined'. This service may not be available in the 'aws-region-1' region.
AWS_DEFAULT_REGION
环境变量配置为 ECR Public 不可用的区域。us-east-1
区域登录。在aws-actions/configure-aws-credentials
操作中, aws-region
输入必须是us-east-1
。 GetAuthorizationToken command is only supported in us-east-1.
AWS_DEFAULT_REGION
环境变量配置为us-west-2
。us-east-1
区域登录。在aws-actions/configure-aws-credentials
操作中, aws-region
输入必须是us-east-1
。Invalid parameter at 'registryIds' failed to satisfy constraint: 'Member must satisfy constraint: [Member must satisfy regular expression pattern: [0-9]{12}]'
registries
输入中提供的注册表之一不是 12 位数字的序列registries
输入中仅提供单个注册表 ID 的用户,如果 ID 以 0 开头,请确保将其括在引号中。如果输入中的所有字符都是数字,则 GitHub Actions 会将输入读取为数字。因此,如果您的注册表 ID 以 0 开头,则 0 将被截断。请参阅问题#225。 该代码在 MIT 许可下可用。
如果您想报告此项目中的潜在安全问题,请不要创建 GitHub 问题。相反,请按照此处的说明操作或直接向 AWS 安全人员发送电子邮件。