【问题标题】:Docker compose v3 named volume & node_modules from npm installDocker compose v3 命名卷和来自 npm install 的 node_modules
【发布时间】:2017-09-18 04:32:42
【问题描述】:

使用 compose v3。

在构建中,我复制 package.json 并将 npm install 运行到

/var/www/project/node_modules

我没有在构建阶段添加任何代码。

在撰写中我添加卷

- ./www:/var/www/project/www

众所周知,绑定到 /www 的主机将有效地“覆盖”我在构建阶段安装的 node_modules。

这就是我们之后添加命名模块的原因

- ./www:/var/www/project/www
- modules:/var/www/project/www/node_modules

这在我们第一次构建/运行项目时工作得很好,很漂亮

由于命名卷“模块”不存在,构建阶段的 www/node_modules 将被挂载。

但是,这是实际问题。

下次我对 package.json 进行更改并执行以下操作时:

docker-compose up --build 

我可以看到新的 npm 模块是如何安装的,但是一旦附加了命名的“模块”卷(它现在存在上一次运行的东西),它就会“覆盖”映像中新安装的模块。

在很多地方都建议使用上述添加命名卷的方法作为节点模块问题的补救措施。但据我从大量测试中可以看出,这只适用于一次。

如果我每次对 package.json 进行更改时都重命名命名卷,它当然会起作用。

【问题讨论】:

  • 曾经丑陋的处理方式是:docker-compose rm 然后docker volume rm named-volume-name 然后docker-compose up
  • 你有想过这个吗?

标签: node.js docker-compose npm-install


【解决方案1】:

更好的做法是在入口点脚本中包含rm 命令,以便在运行npm install 之前清除节点模块。

作为替代方案,您可以在运行另一个构建之前使用$ docker system prune。这将确保没有使用更早的东西。

【讨论】:

    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 2016-11-20
    • 2016-10-08
    • 2021-01-09
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多