昔よくdocker npm install 遅い
などのワードで検索していたのですが、そもそもComposeファイルの書き方をあまりよく理解しておらず、自分のフォルダ構成に落とし込むことができなかった経験があります。
あれから学習し少しは分かるようになったのでその成果を記述します。
ともあれ、もし上記ワードで検索してこの記事に来たならば、できればComposeファイルの記述方法を学んでほしいです。
おすすめ→https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59
docker-compose.yml
version: '3.9'
services:
front:
container_name: ContainerName
working_dir: /front
tty: true
build:
dockerfile: ./Dockerfile
context: .
volumes:
- type: bind
source: .
target: /front
- type: volume
source: node_modules
target: /front/node_modules
volumes:
node_modules:
ここのservices
の中のvolumes
と、一番下のvolumes
がミソです。
簡単な説明
services
の中にあるvolumes
の、- type: bind
から始まる項目ですべてのファイルをバインドマウントしています。詳しくは調べてほしいですが、コンテナとホストでファイルを同期させています。
これを書かないとホストマシンで書いたソースファイルなどがコンテナに反映されないので、とりあえず何も分からずDockerを触ってNode.jsを起動させてみた場合でも書いてあることが多いと思います。
続いて- type: volume
から始まる項目で、node_modules
フォルダのみをボリュームマウントしています。一番下のvolumes
で名前をつけています。
ボリュームマウントはコンテナからは参照できますが、ホストマシンからは参照できません。
つまり、ホストマシンには同期されません。
npm install
したときはnode_modules
フォルダ内に大量のファイルがダウンロードされます。
このとき、node_modules
フォルダをバインドマウントしてると、ホストマシンとコンテナでこの大量のファイルが同期されるため、その分遅くなってしまうんですね。
node_modulesフォルダが空なんだけど・・・
ボリュームマウントしたからです。コンテナ内にはあります。
おわりに
きちんと学習することの大切さを最近実感しています。
おそらくこの記事内でもふわっとした知識で記載してしまっている部分があると思うので、引き続き学習していきます。