Dockerの「マルチCPUアーキテクチャ」に対応したイメージをビルドする

環境を作るときに困ったので、素人ながらに調べて実行したことを記録。

めちゃくちゃ参考にした記事

https://dev.classmethod.jp/articles/docker-multi-architecture-image-build/

https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/buildx/

# 対象のイメージ
先日Docker HubにPushしたこちらのイメージをマルチCPUアーキテクチャに対応してみます。

https://hub.docker.com/repository/docker/symdit/postgresql15-bigm

# 最終的に実行するコマンド

最終的にマルチCPUアーキテクチャに対応したイメージをビルドするコマンド
```bash
docker buildx build --platform linux/amd64,linux/arm64 -t symdit/postgresql15-bigm:latest . --push
```

しかし、デフォルトの状態ではこのようなエラーが発生します。

```
daichi@MacBook-Pro postgres15_bigm % docker buildx build --platform linux/amd64,linux/arm64 -t symdit/postgresql15-bigm:latest . --push
[+] Building 0.0s (0/0)                                                                                                                                                                                                                                                                                                                                                           
ERROR: multiple platforms feature is currently not supported for docker driver. Please switch to a different driver (eg. "docker buildx create --use")
```

# 有効にする設定

上記のエラーを解消するには、事前に変更しなければならない設定があります。

## docker driverの変更
ビルダーインスタンスを作成
```bash
docker buildx create --name mybuilder
```

作成したビルダーインスタンスを使用するように変更
```
docker buildx use mybuilder
```

変更されたことを確認
```bash
docker buildx ls
```

`mybuilder` に`*`がついてればOK
```
daichi@MacBook-Pro postgres15_bigm % docker buildx ls           
NAME/NODE       DRIVER/ENDPOINT             STATUS   BUILDKIT PLATFORMS
mybuilder *     docker-container                              
  mybuilder0    unix:///var/run/docker.sock inactive          
default         docker                                        
  default       default                     running  20.10.20 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
desktop-linux   docker                                        
  desktop-linux desktop-linux               running  20.10.20 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
```

> もし削除したいときは
> ```bash
> docker buildx rm mybuilder
> ```

作ったビルダーインスタンスを起動する
```bash
docker buildx inspect --bootstrap
```

起動したことを確認
```
daichi@MacBook-Pro postgres15_bigm % docker buildx ls                 
NAME/NODE       DRIVER/ENDPOINT             STATUS  BUILDKIT PLATFORMS
mybuilder *     docker-container                             
  mybuilder0    unix:///var/run/docker.sock running v0.10.5  linux/arm64, linux/amd64, linux/amd64/v2, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
default         docker                                       
  default       default                     running 20.10.20 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
desktop-linux   docker                                       
  desktop-linux desktop-linux               running 20.10.20 linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
```

ではここで再度ビルドしてみましょう
(1回目はなぜか失敗しました)
```bash
docker buildx build --platform linux/amd64,linux/arm64 -t symdit/postgresql15-bigm:latest . --push
```

こんな感じで両アーキテクチャのイメージがプッシュされていたら成功！
![スクリーンショット 2022-10-28 13.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/fd987552-d9d7-3fed-6579-9726ab8dcf42.png)