Docker和node_modules - 将它们放在一个层或一个卷中?

rga*_*eth 13 node.js node-modules docker

我正在计划一个docker dev环境,并怀疑是否npm install作为缓存层运行是一个好主意.

我知道有一些方法可以优化dockerfiles以避免重建node_modules,除非package.json发生更改,但是我不希望node_modules每次package.json更改时都完全重建.npm install对我们来说,新鲜的需要花费5分钟,而且变化package.json相当频繁.对于经常审查拉取请求和切换分支的人来说,他们每天可能需要经历5分钟的真气量npm installs.

在像我这样的情况下以某种方式安装node_modules到卷中以使其在构建中持续存在并且小的更改package.json不会导致整个依赖树被重建会不会更好?

mze*_*ler 10

是.不要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"
Run Code Online (Sandbox Code Playgroud)

到目前为止,数据容器module-container将包含由package.jsonin 指定的模块/usr/local/node/node_modules.现在应该可以使用它将它安装在生产容器中--volume-from=module-container.