Dockerでイメージをbuild後にコンテナを起動した時に、sass-loaderを現在のOS環境にバインドできないとのエラーが発生した。
##エラー内容
bootstrap.js:4427 Uncaught Error: Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
Error: Missing binding /usr/src/app/node_modules/node-sass/vendor/linux_musl-x64-83/binding.node
Node Sass could not find a binding for your current environment: Linux/musl 64-bit with Node.js 14.x
Found bindings for the following environments:
- OS X 64-bit with Node.js 12.x
This usually happens because your environment has changed since running
npm install
.
Runnpm rebuild node-sass
to download the binding for your current environment.
Dockerの中で使っているのでlinux用のsass-loaderをインストールしなければいけないが、OS-X用のsass-loaderしかない状況。
###以下対応をしたがエラーは直らず
・npm install
はnpm rebuild node-sass
を実行済み。
・.dockerignoreにnode_modules/*を記載済み。
・volumeでapp/node_modules
をコンテナ内のボリュームのみ割り当て、ホスト側とは同期しない。
##発生原因 本来、コンテナの中でbootstrap関連のパッケージをインストールしなければいけないところ、ローカルで実施したためOS X用のsass-loaderしかインストールされなかった。
##対処法
コンテナに入ってbootstrap関連のパッケージをインストールする。
#コンテナ名を確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88e9777dd7de ruby2.7.2 "bin/rails s -p 3000…" 4 minutes ago Up 4 minutes 0.0.0.0:3001->3000/tcp rails-app
#コンテナに入る(laravelの場合はbash)
$ docker exec -it rails-app sh
/app #
#コンテナの中でbootstrap関連パッケージをインストール
/app # yarn add jquery bootstrap popper.js
コンテナを再起動したところエラーが直った。
Dockerfileでyarnをインストールしているのでyarnを使用したが、npmのときはyarnをnpmに変更する。
##まとめ docker上のプロジェクトでnpmのパッケージをインストールする場合はコンテナの中に入ってインストールする。