Skip to content

Commit

Permalink
Merge pull request #73 from nnn-training/fix-issue-72
Browse files Browse the repository at this point in the history
Apple Silicon を搭載した MacBook で起こる Docker 関連エラーの対処法を追記
  • Loading branch information
moesuke authored Mar 13, 2024
2 parents e2f4cc5 + e3af8b7 commit 8e60a7f
Show file tree
Hide file tree
Showing 13 changed files with 8,778 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ yarn-debug.log*
yarn-error.log*

# local env files
.env
.env.local
.env.development.local
.env.test.local
Expand Down
82 changes: 82 additions & 0 deletions MARKDOWN/intro/docker.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ title: Docker 関連のトラブル
- [(3) (winpty) docker compose exec app bash で失敗する](#3)
- [(4) PostgreSQL のバージョンを上げるとデータベースのコンテナの起動に失敗する](#4)
- [(5) npx prisma で失敗する。または Intel MacBook にて Docker を利用していると Segmentation fault と表示される。](#5)
- [(6) `yarn add [email protected]` で失敗する](#6)
- [(7) M シリーズ Mac にて Docker コンテナ立ち上げ時に警告が出る](#7)

---

Expand Down Expand Up @@ -606,3 +608,83 @@ Intel 製のチップを搭載した MacBook において、 Virtualization Fram
これによって Virtualization Framework を無効化でき、エラーが解消されるはずです。

なお、以前より Docker を利用した際の挙動が重くなる可能性があります。

## (6) `yarn add [email protected]` で失敗する<a id="6"></a>

### 問題詳細
Apple Silicon を搭載した M シリーズ MacBook において、 Docker コンテナ内で `yarn add [email protected]` を実行すると、以下のようなエラーが表示される場合があります。

```sh
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault
```

この場合、 Docker Desktop の設定を変更することで解決が望めます。

### →解決方法

Rosetta という機能を有効にするために、Docker Desktop の設定を変更します。

以下のスクリーンショットで示された右上赤枠内の歯車アイコンをクリックしてください。

![](./images/docker-enable-rosetta-01.png)

次に、Use Rosetta for x86/amd64 emulation on Apple Silicon と書かれたチェックボックスにチェックを入れ、Rosetta を有効化してください。

![](./images/docker-enable-rosetta-02.png)

チェックボックスにチェックを入れたら、右下の「Apply & Restart」と書かれたボタンをクリックして、 Docker Desktop を再起動してください。

![](./images/docker-enable-rosetta-03.png)

これで Rosetta が有効になり、エラーが解消されるはずです。

再起動後、 Docker コンテナを `docker compose up -d --build` コマンドで立ち上げてエラーが解消されたか確認してみてください。

### 原因

これは、 Docker イメージが想定するアーキテクチャと実際のコンピュータのアーキテクチャの違いによって起きるエラーです。

教材では、 `Dockerfile` の 1 行目に `--platform=linux/x86_64` と書かれています。

これが Docker イメージの OS とアーキテクチャを指定するための記述です。

[Docker Hub の Node イメージのタグ一覧](https://hub.docker.com/_/node/tags)を見ると、`OS/ARCH` という部分があるかと思います。<br>
実は Docker イメージは OS とアーキテクチャの組み合わせによって分けられており、この部分がそれを示しています。

![](./images/docker-os-arch.png)

`x86_64` というのは Intel CPU 用のアーキテクチャで、 `AMD64` とも言われるものです。一方で、M シリーズ Mac の CPU は ARM アーキテクチャを採用しています。<br>
つまり、`--platform=linux/x86_64` を指定すると、ARM アーキテクチャで動く CPU 上で AMD64 アーキテクチャを動かさなければなりません。

このための仕組みとしてエミュレータが用意されており、Docker イメージの対応するアーキテクチャと実際のコンピュータのアーキテクチャの差異を吸収してくれるようになっています。

そして今回のエラーは、使っているエミュレータがうまく動作していないことが原因です。

ですので、エミュレータを Rosetta というものに切り替えることで解消します。

## (7) M シリーズ Mac にて Docker コンテナ立ち上げ時に警告が出る<a id="7"></a>

### 問題詳細

M シリーズ Mac にて Docker コンテナ立ち上げ時に以下のような警告が出る場合があります。

```sh
app The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
```
### →解決方法
これは致命的なエラーではないので、教材の進行に問題はありませんので無視しても大丈夫です。
教材で提示された `Dockerfile` の 1 行目にある `--platform=linux/x86_64` を削除し、 `docker compose up -d --build` コマンドを実行すれば解決するはずです。
### 原因
これは [(6) `yarn add [email protected]` で失敗する](#6)と同じことが原因です。
使っているパソコンのアーキテクチャが Docker イメージが想定するものと異なるため、パフォーマンスが低下する可能性があり、それを警告として表示しているものです。
M シリーズ Mac が搭載している Apple Silicon は CPU のアーキテクチャが ARM アーキテクチャですので、それに対応したイメージを使った方がパフォーマンスが向上します。
`--platform=linux/x86_64` という記述をなくすと、自動的に Apple Silicon に対応したイメージを使ってくれるようになります。
Loading

0 comments on commit 8e60a7f

Please sign in to comment.