docker で node_modules を扱う時に調べた事

今回調べたのは下記 3 点となります。
ちょっと調べてから記事にするまでに時間が経過してるのであれですが。

  • npm install と npm ci の違い
  • package.json が下層階にある時
  • node_modules 空問題

npm install と npm ci

参考:

環境を再構築する為 npm install で node_modules を作成しようとしたらバージョン的なエラーが出て来ました。
そういえば npm ci と言うのもあったので違いを調べてみましたが下記の通りです。

  • npm install → package-lock.json を更新することがしばしばある。
  • npm ci → package-lock.json を元に node_modules を構築しなおす。

下記は npm ci の具体的処理抜粋。

1.node_modules ディレクトリの削除
2.package-lock.json と package.json の整合性のチェック。違ったらエラーを吐く。
3.package-lock.json から node_modules を再現

この為 git clone した時は npm ci の方が良いとの事。

ちなみに試していませんが yarn だと ここ で質問されています。

package.json が下層階にある時

参考:サブフォルダにある package.json で npm install したいときの prefix オプションを実験してうまくいったメモ

dockerfile で npm install している記事が見られたので「node_modules はイメージに含める」のが良いのか?とか思い npm ci を dockerfile に組み込む事にしてみました。
git clone した時の階層は下記の通りです。

project
├── backend
├── docker-compose.yml
├── dockerfile
├── frontend
│   ├── package-lock.json
│   ├── package.json
│   ├── src
│   └── webpack.config.js
└── mysql

package 系が ./frontend/ 配下にあります。
このように package 系が下層階にある時は、cd しなくとも次のコマンドで実行できるようです。

# dockerfile
RUN npm --prefix frontend ci project/frontend

node_modules 空問題

参考:node_modules/ and Docker volume mount 問題と対策

前述の通りに dockerfile を指定したので docker-compose でコンテナを立ち上げました。
volume でホストとコンテナでコードを共有していましたが、node_modules が空になってしまいました。

原因は次の通りとの事。

コンテナの外側(ホスト側)では npm install してないので、空の node_modules/ がコンテナ内に同期されてしまう

と言う事で対策として「ホスト側のディレクトリをマウントしない」事で解決できるようです。この場合、ホスト側の node_modules をマウントしたくないので次の通りに記述して解決できました。

# docker-compose
volumes:
  - .:/project
  - /project/frontend/node_modules

追記

docker について詳しいスライドがあったので一応リンクを残しておこうと思います。
Docker Compose 徹底解説

YouTube