😽

CircleCIでマルチアーキテクチャ対応のDockerイメージをビルドする

2022/02/22に公開

結論

いきなりですが以下のように書きます。

.circleci/config.yml
version: 2.1
orbs:
  docker: circleci/docker@2.0.2
executors:
  amd64:
    machine:
      image: ubuntu-2004:202111-02
      docker_layer_caching: true
    resource_class: medium
    environment:
      DOCKER_BUILDKIT: 1
  arm64:
    machine:
      image: ubuntu-2004:202101-01
      docker_layer_caching: true
    resource_class: arm.medium
    environment:
      DOCKER_BUILDKIT: 1
commands:
  build:
    parameters:
      arch:
        type: string
    steps:
      - checkout
      - docker/check
      - docker/build:
          image: shojikai/alpine
          tag: << parameters.arch >>-${CIRCLE_SHA1}
      - docker/push:
          image: shojikai/alpine
          tag: << parameters.arch >>-${CIRCLE_SHA1}
jobs:
  build_amd64:
    executor: amd64
    steps:
      - build:
          arch: amd64
  build_arm64:
    executor: arm64
    steps:
      - build:
          arch: arm64
  deploy:
    executor: amd64
    steps:
      - docker/check
      - run:
          name: "Create manifest"
          command: |
            docker manifest create shojikai/alpine:latest \
              --amend shojikai/alpine:amd64-${CIRCLE_SHA1} \
              --amend shojikai/alpine:arm64-${CIRCLE_SHA1}
      - run:
          name: "Push manifest"
          command: |
	    docker manifest push shojikai/alpine:latest
workflows:
  version: 2
  build_and_deploy:
    jobs:
      - build_amd64
      - build_arm64
      - deploy:
          requires:
            - build_amd64
            - build_arm64

ポイントとしては、

  • amd64, arm64それぞれのmachineを使ってビルドする
  • 最後にマニフェストを作成してプッシュする

といったことくらいです。
あと、今回のDockerfileはalpineをFROMしているだけです。

Dockerfile
FROM alpine

確認

arm64

% arch
arm64
% docker run shojikai/alpine arch
aarch64

x86_64/amd64

% arch
x86_64
% docker run shojikai/alpine arch
x86_64

Discussion