開発やCIでやDockerイメージをbuildする際にnpm installすると、cacheがないため時間がかかる。
これはpackageの数が多くなると結構辛いことになるので、なんとかできないかと試してみた。
以下のような適当なpackageを使って試してみる。
1 | { |
Alpine Linuxを利用する
そもそものDcokerイメージを最小にしておくこと。
Alpine Linuxでイメージを作成する。
1 | # application.dockerfile |
この状態で計測する。
1 | time npm i |
Install Progressを無効化する
npm install時にProgress Barを出すと遅くなるので、非表示にする。
1 | time npm i --production --no-progress |
SSLを利用しない
もし可能ならばSSLを使わない、proxyをつかってhttpのregistryを使う。
1 | time npm i --no-progress --registry http://registry.npmjs.org/ |
Cache Container を使う
キャッシュコンテナを利用するために、簡単なpackageをキャッシュするだけなコンテナを作成。
1 | # cache.dockerfile |
このコンテナのnode_modulesディレクトリをマウントする。
1 | docker build -t cache -f cache.dockerfile . |
1 | time npm i |
CIなどでDockerを使っている場合はcacheコンテナをサポートしていると思うので、
cacheコンテナを利用すると圧倒的に改善できそう。
毎回キャッシュコンテナにinstallしてるのつらいので、package.jsonに変更ある場合のみキャッシュコンテナをupdateする必要がある。
1 | git diff --name-only master $(git rev-parse --abbrev-ref HEAD) | grep -q package.json |
そのほか
一度キャッシュしてしまえば、以下のように
cache-min オプションに十分に大きな値を渡す。
cache-minはキャッシュを再チェックするまでの最小時間となるので、これによりキャッシュからインストールするようにできる。
1 | npm i --cache-min 999999 |
また、devDependenciesが不要ならばproductionオプションを追加して
1 | npm i --production |
でdependenciesのみインストールすると良さそう。
参考にしたページ
cache-min & unknown version
feature request: force install from cache.