#9.Dockerコンテナビルド時にWindowsとMacの違いで苦戦した話

# はじめに
本日、台東区でおこなわれた株式会社ギークフィード様主催のもくもく会に参加してきました。
お菓子やドリンク、さらに個人用に接続用のモニターも準備されており、エンジニアが集中して学べる快適な環境が提供されていました。

https://geekfeed.connpass.com/event/338230/

今回は、こちらで勉強している際にWindowsとMacの違いで苦戦した点について記事にしました。

# Macの操作むずすぎない？
Macはほとんど触っておらず（Spotlightのショートカットも今日知ったレベル）
普段はWindowsデスクトップのWSL2を利用して学習しているのですが、
外出時やイベント参加のために以前Macを購入しており、VScodeやGitの設定を最低限行なって放置しておりました。
しかもWindowsとショートカットキーが全然違うので、中々慣れずたいへんでした。

# MySQLのコンテナビルド時にエラーが起きる
本日は、Kubernetesの勉強をしようと考えており、
実際にKubernetesの勉強を始めようと思い、事前にGitに上げていたマニフェストファイルをpullした後に`docker build ` コマンドを実行したのですが、以下のようにエラーが発生しました。

```
nayataiyounoMacBook-Air:mysql nayataiyou$ docker build . -t mysql:v1.0.0
[+] Building 1.9s (3/3) FINISHED                                                                                           docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                       0.0s
 => => transferring dockerfile: 1.03kB                                                                                                     0.0s
 => ERROR [internal] load metadata for docker.io/library/mysql:8.0.28                                                                      1.8s
 => [auth] library/mysql:pull token for registry-1.docker.io                                                                               0.0s
------
 > [internal] load metadata for docker.io/library/mysql:8.0.28:
------
Dockerfile:1
--------------------
   1 | >>> FROM mysql:8.0.28
   2 |     
   3 |     # 環境変数の設定
--------------------
ERROR: failed to solve: mysql:8.0.28: failed to resolve source metadata for docker.io/library/mysql:8.0.28: no match for platform in manifest: not found
```
プラットフォームに対応していないといったメッセージが発生したので、イメージファイルの状態を確認してみました。
```
nayataiyounoMacBook-Air:mysql nayataiyou$ docker manifest inspect mysql:8.0.28
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 2828,
         "digest": "sha256:e9fee3e714fd69cd2ccfa0c6a141fac0a60f2a02f72d43c0e7055601aaf481b0",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      }
   ]
}

```

Dockerのビルド時にアーキテクチャを明示しない場合、デフォルトでは使用しているマシンのCPUアーキテクチャに依存します。
なので自環境のアーキテクチャを確認してみました。

### アーキテクチャの確認 
```
nayataiyou@nayataiyounoMacBook-Air ~ % uname -m
arm64
```
arm64と出てきましたね。
ということでアーキテクチャが違っただけみたいですね。

なので使用するアーキテクチャを明示的に指定してビルドしてみます。

```
nayataiyounoMacBook-Air:mysql nayataiyou$ docker build . --platform linux/amd64 -t mysql:v1.0.0
```

```
[+] Building 2.8s (13/13) FINISHED                                                                                         docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                       0.0s
 => => transferring dockerfile: 1.03kB                                                                                                     0.0s
 => [internal] load metadata for docker.io/library/mysql:8.0.28                                                                            2.7s
 => [auth] library/mysql:pull token for registry-1.docker.io                                                                               0.0s
 => [internal] load .dockerignore                                                                                                          0.0s
 => => transferring context: 2B                                                                                                            0.0s
 => [1/7] FROM docker.io/library/mysql:8.0.28@sha256:fc77d54cacef90ad3d75964837fad0f2a9a368b69e7d799665a3f4e90e600c2d                      0.0s
 => => resolve docker.io/library/mysql:8.0.28@sha256:fc77d54cacef90ad3d75964837fad0f2a9a368b69e7d799665a3f4e90e600c2d                      0.0s
 => [internal] load build context                                                                                                          0.0s
 => => transferring context: 65B                                                                                                           0.0s
 => CACHED [2/7] RUN rm -f /etc/apt/sources.list.d/mysql.list     && apt-get update     && apt-get install -y --no-install-recommends      0.0s
 => CACHED [3/7] RUN echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen     && locale-gen ja_JP.UTF-8                                              0.0s
 => CACHED [4/7] RUN touch /var/log/mysqld.log     && chown mysql:adm /var/log/mysqld.log                                                  0.0s
 => CACHED [5/7] RUN mkdir /var/mysql     && chown mysql:adm /var/mysql     && rm -rf /etc/mysql/conf.d                                    0.0s
 => CACHED [6/7] COPY ./my.cnf /etc/mysql/                                                                                                 0.0s
 => CACHED [7/7] RUN chmod 644 /etc/mysql/my.cnf                                                                                           0.0s
 => exporting to image                                                                                                                     0.0s
 => => exporting layers                                                                                                                    0.0s
 => => exporting manifest sha256:24bfc8f6b67d686af6bd38a28590f23503024532835f5b21cafea44fc82ca815                                          0.0s
 => => exporting config sha256:cceef464a75dd3403d8911953d7d64b4c14bf2470838e7f9e4c0649eee64c09d                                            0.0s
 => => exporting attestation manifest sha256:4191413e51a26ea048c3d8e133f6ce78e92471b67eff0b2177ed8111314ecbfd                              0.0s
 => => exporting manifest list sha256:c6c2418cc2172314204aa68709516a1cd3694b4ace6426784f8654699b74421d                                     0.0s
 => => naming to docker.io/library/mysql:v1.0.0                                                                                            0.0s
```

どうやらいけたっぽい

```
nayataiyounoMacBook-Air:mysql nayataiyou$ docker images

[省略】
mysql                                     v1.0.0                                                                        c6c2418cc217   59 minutes ago   184MB
```
# まとめ
こうした些細なことでも、知っているかどうかで解決までの時間が大きく変わると思います。今回の経験は良い学びになりましたし、初めて遭遇するトラブルでも、似たような事象が発生した際に「前にもこんなことがあったなぁ〜」と思い出して対応できることが増えると思います。やはり、小さな知識や経験の積み重ねは大切だと改めて実感しましたね！


もくもく会を開催いただいた株式会社ギークフィード様ありがとうございました！
とても快適な環境で勉強させていただきました。
年明けも開催するとのことなので、気になる方はぜひ参加してみましょう！

■参考リンク

https://qiita.com/ASONE0923/items/39992e2deb610dda105d

https://developer.a-blogcms.jp/blog/custom/docker-arm64.html#:~:text=%E3%80%8Camd64%E3%80%8D%E3%80%8Cintel64%E3%80%8D%E3%80%8C,OS%20%E3%81%AE%20%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A7%E3%82%82%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82