MacでARM用Dockerイメージを作成する

dockerのExperimental機能であるbuildxを利用すると、異なるCPUアーキテクチャ用のDockerイメージを作ることができます。
今までは、ARM用のDockerイメージを作るためにはARM用のマシンでDockerイメージをbuildする必要がありましたが、
buildxを利用することでローカルで作業を完結させることができるようになりました。

## 環境用意
まずはインストール済みのDocker Desktopのバージョンが以下であることを確認します。

* Docker Desktop Version 2.0.4.0 (33772)  以上

また、buildxはExperimental機能のため利用するために以下のように設定ファイルを編集する必要があります。

$HOME/.docker/config.json

```
{
  "stackOrchestrator" : "swarm",
  "credsStore" : "desktop",
  "auths" : {
    "787080764332.dkr.ecr.ap-northeast-1.amazonaws.com" : {

    },
    "https://index.docker.io/v1/" : {

    }
  },
  "HttpHeaders" : {
    "User-Agent" : "Docker-Client/19.03.5 (darwin)"
  },
  "experimental": "enabled" <-- ここを追加
}
```

次にbuild用のコンテナを作成していきます。

```
$ docker buildx create --name buildarm --platform linux/arm64 --use
$ docker buildx use buildarm
$ docker buildx inspect --bootstrap
[+] Building 0.8s (1/1) FINISHED                                                                                                                                                                                                                                             
 => [internal] booting buildkit                                                                                                                                                                                                                                         0.8s
 => => starting container buildx_buildkit_buildarm0                                                                                                                                                                                                                     0.8s
Name:   buildarm
Driver: docker-container

Nodes:
Name:      buildarm0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Platforms: linux/arm64, linux/amd64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
```

これでARM用のDockerイメージを作る準備ができました。

## Dockerイメージを作成

ここではテスト用に簡易的なDockerfileを用意してbuildしていきます。

```
$ mkdir test && cd test && cat <<EOF > Dockerfile

FROM ubuntu
RUN apt-get update && apt-get install -y curl
WORKDIR /src
COPY . .
EOF
```

以下イメージ作成になります。

```
$ docker buildx build --platform linux/arm/v7 -t test-buildx --load .                   
[+] Building 8.3s (10/10) FINISHED                                                                                                  
 => [internal] load build definition from Dockerfile                                                                           0.0s
 => => transferring dockerfile: 31B                                                                                            0.0s
 => [internal] load .dockerignore                                                                                              0.0s
 => => transferring context: 2B                                                                                                0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest                                                               4.7s
 => [internal] load build context                                                                                              0.0s
 => => transferring context: 31B                                                                                               0.0s
 => [1/4] FROM docker.io/library/ubuntu@sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7                0.0s
 => => resolve docker.io/library/ubuntu@sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7                0.0s
 => CACHED [2/4] RUN apt-get update && apt-get install -y curl                                                                 0.0s
 => CACHED [3/4] WORKDIR /src                                                                                                  0.0s
 => CACHED [4/4] COPY . .                                                                                                      0.0s
 => exporting to oci image format                                                                                              3.4s
 => => exporting layers                                                                                                        0.0s
 => => exporting manifest sha256:75f5df7b0a817b040d8e06c4547c17734bf719ce038f91a0f59e4b379a0213b7                              0.0s
 => => exporting config sha256:4815274966cce0c0f0ce84e54cd28b9ee02164bd1d3e4899578d1176e0388506                                0.0s
 => => sending tarball                                                                                                         3.4s
 => importing to docker                                                                                                        0.0s
$ docker images | grep test-buildx                                          
test-buildx                                           latest                         4815274966cc        About an hour ago   82.1MB
```