/lost+found/amanoese

作られては忘れられていくコードや日常のための日記

dockerのbuildxでマルチアーキテクチャ対応のコンテナをビルドするシンプルな例…なのかもしれない

最近はM1 Macのおかげで流行ってるのでしょうか?

去年(2020年10月頃)に試してたみたいなんですが、ブログ記事にしていなかったみたいです。 と言うより、当時のArmでの有名どころはRaspberryPIやAWS EC2 A1インスタンスとかで、その後流行るとは思わなかったし必要になることも無いと思って残さなかったのでしょう。 M1 Macが2020/11/11に発表されたことで、大きく世間の流れが変わりましたね……

今はやり方変わってるのかなと思いましたが、試したところ一応下記の方法でできるみたいです。

下記が昔自分が作ったRepositoryとDockerhubに登録したイメージらしい

ここにあるのがすべてです。 github.com

hub.docker.com

ローカルの環境でbuild/pushするには buildxが必要みたいです

WindowsまたはMacの場合は、Docker Desktopの設定を変更するだけで簡単に使えるようですが、 自分の環境はUbuntu 20.04なLinuxなのでバイナリをインストールする必要があるようです。

$ curl --create-dirs -sL -o ~/.docker/cli-plugins/docker-buildx https://github.com/docker/buildx/releases/download/v0.6.3/buildx-v0.6.3.linux-amd64
$ chmod +x ~/.docker/cli-plugins/docker-buildx
$ echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json
$ sudo systemctl restart docker
$ docker version -f '{{.Server.Experimental}}'

これでbuildxが利用できるようになります。 次にbuildxでビルドするためのビルド用インスタンスを作成する必要があるみたいです。 下記で作りましょう。

$ docker buildx create --use --name xbuilder

$ docker buildx ls
NAME/NODE   DRIVER/ENDPOINT             STATUS  PLATFORMS
xbuilder *  docker-container                    
  xbuilder0 unix:///var/run/docker.sock running linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
default     docker                              
  default   default                     running linux/amd64, linux/386

「xbuilder」という名前のインスタンスで10個くらいのアーキテクチャに対応したコンテナをビルド出来るようになったぽいです。 実際にローカルにあるDockerfileを「amd64」と「arm64」用にビルドしてdockerhubにpushします。 --pratformで指定するだけなので簡単ですね。

$ docker buildx build --platform linux/amd64,linux/arm64 -t ananoese/dockerx-ex --push .

CircleCIでbuild/pushするための設定

シンプルなDockerイメージのため、特に難しい設定は書かれていませんでした。
buildxのversionが0.4.2なのは、1年前に作ったリポジトリだからですね。。。

version: 2
jobs:
  buildx:
    docker:
      - image: docker:stable
        environment:
          DOCKER_BUILDKIT: "1"
    steps:
      - run:
          name: pre install
          command: |
            apk add --no-progress git curl
      - checkout
      - setup_remote_docker
      - run: 
          name: install buildx
          command: |
            mkdir -vp ~/.docker/cli-plugins/
            curl -sL -o ~/.docker/cli-plugins/docker-buildx https://github.com/docker/buildx/releases/download/v0.4.2/buildx-v0.4.2.linux-amd64
            chmod a+x ~/.docker/cli-plugins/docker-buildx
      - run:
          name: buildx and Push dockerhub
          command: |
            echo ${DOCKER_PASS} | docker login -u ${DOCKER_USER} --password-stdin
            docker buildx build --platform linux/amd64,linux/arm64 -t ${DOCKER_USER}/dockerx-ex --push .
workflows:
  version: 2
  commit-workflow:
    jobs:
      - buildx

dockerhubパスワードについては、CircleCIの設定画面を見る限りAccessTokenを利用しているようでした。

f:id:amanoese:20211102141929p:plain
CircleCIの設定画面

おわり

一年前の自分はシェル芸BotのRasberryPi用のイメージを作ろうとして、 少し手をつけたところでビルド方法を大きく変える必要があることに気づき止めた記憶です。

マルチアーキテクチャを意識最初から意識してDockerfileを作ってないと対応が難しそうながするのは気の所為でしょうか…… M1 Mac普及したら、マルチアーキテクチャ対応のイメージが当たり前になるんでしょうか?楽しみですね。

記事に誤りがあるようでしたらご教示いただけると幸いです。