エラーが発生した状況
DockerでNext.jsの環境を構築し、開発を行なっていました。
ホスト側でyarn add
をした後にdocker compose up
したところFailed to load SWC binary for linux/arm64
となりました。
$ yarn add @mui/material @mui/styled-engine-sc styled-components
$ docker compose up
[+] Running 1/0
⠿ Container next-front-1 Crea... 0.0s
Attaching to next-front-1
next-front-1 | yarn run v1.22.18
next-front-1 | $ next dev
next-front-1 | ready - started server on 0.0.0.0:3000, url: http://localhost:3000
next-front-1 | error - Failed to load SWC binary for linux/arm64, see more info here: https://nextjs.org/docs/messages/failed-loading-swc
next-front-1 | info - Attempted to load @next/swc-linux-arm64-gnu, but it was not installed
next-front-1 | info - Attempted to load @next/swc-linux-arm64-musl, but it was not installed
next-front-1 | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
next-front-1 | error Command failed with exit code 1.
next-front-1 exited with code 1
原因
ホスト側でyarn add
などをしてしまうとswc-linux-arm64~
がなくなり、Failed to load SWC binary for linux/arm64
となります。
確認したところ、ホスト側でyarn add
をしたことでnode_modules/.yarn-integrity
内の"systemParams"
が"linux-arm64-93"
からdarwin-arm64-93
に変更されていました。
下の画像左がホスト側でyarn add
した後の.yarn-integrity
で右がする前の.yarn-integrity
です。
またnode_modules
内の@next
を確認すると上記と同様にswc-linux-arm64~
がswc-darwin-arm64
に置き換わっていました。
なおpackage.json
及びyarn.lock
にはyarn add
で追加されたもの以外の変更箇所はないようでした。
ホスト側及びコンテナ側のOS名とアーキテクチャを確認すると以下のとおりでした(M1 macを使用しています)。
$ uname -s -m
Darwin arm64
$ docker compose run サービス名 uname -s -m
Linux aarch64
OSが異なっていることがわかります。
arm64
及びaarch64
については以下のページをご参照ください。
ホスト側でyarn add
したことでホスト側のOSなどに基づいてswc-darwin-arm64
がインストールされ、swc-linux-arm64~
がswc-darwin-arm64
に置き換わります。
この変更がdocker compose up
した際にコンテナ内に反映されます。
するとコンテナ内の環境で必要なswc-linux-arm64~
が存在しないため、Failed to load SWC binary for linux/arm64
となります。
解決方法
ホスト側でyarn add
する前の状態に再度変更するか、上記の変更がコンテナ内に加わらないようにする必要があります。
コンテナ側でyarn install
コンテナ内でyarn install
することでホスト側でyarn add
する前の状態に戻ります。
具体的には以下の通りです。
$ docker compose run サービス名 yarn install
yarn install v1.22.18
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 121.88s.
$ docker compose up
[+] Running 1/0
⠿ Container next-front-1 Crea... 0.0s
Attaching to next-front-1
next-front-1 | yarn run v1.22.18
next-front-1 | $ next dev
next-front-1 | ready - started server on 0.0.0.0:3000, url: http://localhost:3000
next-front-1 | wait - compiling...
next-front-1 | event - compiled client and server successfully in 2.1s (124 modules)
docker compose run サービス名 yarn install
でコンテナ側で node_modules
が作成され、その変更がホスト側にも反映されます。
よってその後にdocker compose up
すると問題なく起動します。
volume
を利用する
node_modules
に対してボリュームを設定し、ホスト側のnode_modules
に対する変更がコンテナ内に反映されないようにします。
docker-compose.yml
のvolumes
を以下のように記述します。
version: '3.9'
services:
front:
build: .
volumes:
- .:/myapp
- node_modules:/myapp/node_modules
environment:
NODE_ENV: development
ports:
- 3000:3000
volumes:
node_modules:
上記では名前付きボリュームを利用していますが、匿名ボリュームでも可です。
匿名ボリュームの場合には以下のようになります。
version: '3.9'
services:
front:
build: .
volumes:
- .:/myapp
- /myapp/node_modules
environment:
NODE_ENV: development
ports:
- 3000:3000
より詳細な説明を以下に記述しました。
ホスト側でyarn install
不可にする
ホスト側でyarn install
やyarn add
を実行することでエラーが発生するため、これらを実行できなくすることで予防することができます。
実行不可にする方法については以下のページに記載しています。
npmの場合
npmを使用した場合についても確認しました。
create-next-app
実行時に--use-npm
オプションを付けることでnpmを使用することができます。
結果、npmの場合にはホスト側でnpm install
を実行してもnode_modules
内@next
のswc-linux-arm64~
がswc-darwin-arm64
に変更されることはなく、swc-linux-arm64~
とswc-darwin-arm64
の両方が存在するようになりました。
そのため、ホスト側でnpm install
をしてもFailed to load SWC binary for linux/arm64
は発生しません。
ただし、node_modules
が存在しない状態でホスト側でnpm install
を実行するとswc-darwin-arm64
だけがインストールされ、docker compose up
するとFailed to load SWC binary for linux/arm64
が発生します。
node_modules
が存在しない状態でホスト側でnpm install
した後
ホスト側でnpm ci
した場合もnode_modules
が再生成されるため上記と同様になります。
「ホスト側でnpm install
する前」の状態に戻すためには、コンテナ側でnpm ci
を実行します。
具体的には以下のコマンドを実行します。
$ docker compose run <サービス名> npm ci
npm install
では、swc-linux-arm64~
は追加されエラーは解消されるものの、node_modules
が再生成されるわけではないため、swc-darwin-arm64
は存在せずswc-linux-arm64~
のみ存在する状態にならないことがあります。
参考になるページ