どんな問題?
最近、docker-compose
でnode
の環境を構築するとき、コンテナ内のnode_modules
がどっかに行ってしまうという問題に遭遇した。
いろいろ調べてみると、docker-compose
でローカルのディレクトリをコンテナ内にマウントする際に、上書きされてしまい、コンテナ内のnode_modules
が消えてしまっているようだ。
どう解決したの?
https://qiita.com/suin/items/e53eee56da23d476addcの記事などを見ると、volumes
を作成し、node_modules
をそこにマウントすることで、回避することができるようだ。
しかし、これだとローカル環境にnode_modules
が生成されないため、TypeScript
でパッケージの型定義を参照できず、TypeScript
を使うことの旨味が薄れてしまう。
この問題を解決するために、docker-compose
のcommand
でyarn install
もすることで、コンテナ内のnode_modules
をローカルにマウントされるようにして、ローカルにnode_modules
を持ってくるようにしている記事を見た。
だが、この方法だとdocker-compose up
をするときにyarn install
が走ってしまうため、docker-compose up
でまあまあな時間がかかってしまった。(ローカルにコンテナ内のnode_modules
を持ってくるのにもめちゃめちゃ時間がかかっているようだった)
そこで、以下のような方法で解決をするようにした。(この解決方法がBadであれば、教えていただけると勉強になります)
.
├── app
│ ├── Dockerfile
│ └── src
│ ├── package.json
│ └── yarn.lock
└── docker-compose.yml
FROM nodeWORKDIR /appADD src/package.json /app/ADD src/yarn.lock /app/RUN yarn install
volumes:# ←追加app_node_modules:# ←追加services:app:image:./appvolumes:-./app/src:/app/-./app/src/node_modules:/app/node_modules# ←追加# 以下略
ここまでは https://qiita.com/suin/items/e53eee56da23d476addcの記事と同じだ。
これにプラスで、パッケージを追加したときに以下のスクリプトを実行すること(docker-compose build
の代わり)で、ローカルにもnode_modules
を生成するようにした。
docker-compose build
cd app/src && yarn install
とりあえずこれで、node_modules
が消えてしまう問題と型定義がない問題を解決することができた。
しかし、ローカル環境にnode
があることが前提になってしまっているため、もっといい解決方法があればいいな〜と思っている。(が、わからなかった)
おわりに
いい解決方法があればぜひ教えていただけると嬉しいです。