使用 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