使用 GitHub Actions 构建多平台容器镜像并推送至 ECR
为了支持 AWS 的 EKS 和 ECS,可以选择 x86_64 或 Graviton 的 arm64,因此希望能将可使用任一平台的容器映像设置为多平台兼容的映像。为此,我尝试使用 GitHub Actions 进行构建和推送。
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# https://github.com/docker/setup-qemu-action
- name: Setup QEMU
uses: docker/setup-qemu-action@v3
# https://github.com/docker/setup-buildx-action
- name: Setup Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
# https://github.com/aws-actions/configure-aws-credentials
- name: Get AWS Credentials
id: creds
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ env.AWS_ROLE_ARN }}
aws-region: ${{ env.AWS_REGION }}
# https://github.com/docker/metadata-action
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ steps.creds.outputs.aws-account-id }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.REPOSITORY }}
tags: |
type=ref,event=tag
type=sha
# https://github.com/aws-actions/amazon-ecr-login
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
# https://github.com/docker/build-push-action
- name: Build and push
uses: docker/build-push-action@v5
with:
context: some/where
platforms: linux/amd64,linux/arm64
push : true
tags: ${{ steps.meta.outputs.tags }}
provenance: false
我本来打算用container image在AWS Lambda上运行,希望支持x86_64和arm64两种架构,所以尝试使用multi-platform image,但是发现AWS Lambda不支持multi-platform image。
所以,我为 linux/amd64 和 linux/arm64 分别编写了 docker/metadata-action 和 docker/build-push-action。真是个喜人的结局。
-
- docker/setup-qemu-action
-
- docker/setup-buildx-action
-
- aws-actions/configure-aws-credentials
-
- docker/metadata-action
-
- aws-actions/amazon-ecr-login
- docker/build-push-action