我正在规划一个docker dev环境,并怀疑将npm install
作为缓存层运行是一个好主意。
我知道有ways to optimize dockerfiles to avoid rebuilding node_modules unless package.json changes,但是每次node_modules
更改时我都不想完全重建package.json
。新的npm install
对我们来说需要5分钟以上,对package.json
的更改会经常发生。对于经常审查拉取请求和切换分支的人来说,他们可能不得不每天花费5分钟npm installs
的真气。
在像我这样的情况下以某种方式将node_modules
安装到卷中以使其在构建中保持不变并且package.json
的小变化不会导致整个依赖树正在重建?
答案 0 :(得分:9)
是。不要一遍又一遍地重建node_modules
。只需将它们粘贴在数据容器中,然后将其挂载即可读取。您可以立即重建node_modules
中央流程。
作为一个额外的好处,您可以获得更可预测的构建,因为您可以强制每个人都使用相同的节点模块。如果您想确保实际测试的是您计划投入生产的相同内容,这一点至关重要。
像这样(未经测试!):
docker build -t my/module-container - <<END_DOCKERFILE
FROM busybox
RUN mkdir -p /usr/local/node
VOLUME /usr/local/node
END_DOCKERFILE
docker run --name=module-container my/module-container
docker run --rm --volumes-from=module-container \
-v package.json:/usr/local/node/package.json \
/bin/bash -c "cd /usr/local/node; npm install"
到目前为止,数据容器module-container
将包含package.json
中/usr/local/node/node_modules
指定的模块。现在应该可以使用--volume-from=module-container
将其挂载到生产容器中。