將本機 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 安全人員發送電子郵件。