docker build で npm install してたら時間がかかって辛かった話
Node.js の Web アプリケーションを Docker コンテナにする場合、以下のようにして RUN
で npm install
を実行するのが一般的だと思います。
Dockerfile
(省略) RUN npm install (省略)
これにより docker build
時に npm install
が呼ばれます。
基本的にはこれで問題ないのですが、 CI で頻繁に docker build
を実行する場合に、毎回 npm install
を実行すると時間がかかってしまいます。
通常の node アプリケーションでは、 CI で node_modules
をキャッシュするものだと思いますが、さすがにコンテナ内の node_modules
は CI ではキャッシュできません。
悩んだ結果、以下のようにして npm install
を CI で行い、 Dockerfile でそれを COPY
するようにしました。
circle.yml
(省略) dependencies: override: - npm install (省略)
Dockerfile
(省略) COPY ./node_modules /app/ (省略)
これにより CI で時間がかかる問題は解消されました。
しかしこの方法では docker build
の前に必ず npm install
が必要になってしまうので、正しいやり方ではないようにも感じます。
もっと良いやり方があれば教えてほしい...。
Docker でよく使うコマンドまとめ
Docker で僕がよく使うコマンドをまとめてみる。
削除系
# コンテナを全て削除する docker ps -a | awk '{print $1}' | xargs docker rm -f # イメージを全て削除する docker images | awk '{print $3}' | xargs docker rmi