【问题标题】:Docker npm install --production not workingDocker npm install --production 不工作
【发布时间】:2022-04-26 20:17:14
【问题描述】:

我有一个 dockerfile,我在其中使用 alpine-nodejs 版本 16 作为基础映像。 npm 版本为 8。

在执行docker build 的同时执行npm install --production 的步骤时,它也在安装package.json 的dev-dependencies 下列出的依赖项,这与生产标志的用例相反。 我也使用了npm install --only=production,但这似乎也不起作用。

使用 alpine nodejs 版本 14,标志按预期工作,并且未在容器中安装开发依赖项。 alpine 节点版本 16 映像有什么问题吗?谢谢。

【问题讨论】:

  • 与实际发生的情况相比,预期的行为是什么?
  • 期望它不应该安装 package.json 的 devdependencies 块中提到的依赖项。而目前它正在安装开发依赖项和依赖项。
  • 您能否编辑问题以包含minimal reproducible example?你怎么知道安装了错误的依赖集?
  • 我可以确认同样的问题with node:16.14-stretch-slim image。
  • @Passiday - 经过数周的努力,我找到了问题的根本原因。请寻找我的答案。希望它有所帮助。谢谢。

标签: docker npm dockerfile npm-install alpine


【解决方案1】:

我怀疑你的Dockerfile 可能有类似COPY . . 的东西,但你没有正确设置.dockerignore,例如您没有将node_modules 添加到您的.dockerignore 中(查看COPY with docker but with exclusion 以获取有关.dockerignore 的更多信息)

我也犯了同样的错误,它应该与nodejs14或nodejs16无关

顺便说一句,npm install --only=prod[uction]npm 6.x formatnpm install --productionnpm 8.x format。一个区别是,在 npm 8.x 中,如果您设置 NODE_ENV production,即使您运行 npm install,npm 8.x 也只会安装依赖项,但对于 npm6.x,npm install --only 将忽略 NODE_ENV

【讨论】:

    【解决方案2】:

    在这个问题上苦苦挣扎了几个星期,我终于找到了根本原因,不注意这一点真的很愚蠢,我不想让别人犯同样的错误。由于代码是专有的,我不能分享它。但我会解释这个问题。

    带有nodejs:16 的图像使用npm 8.0,而带有nodejs:14 的图像使用一些npm 版本

    它们之间的区别在于版本 8.0,npm 还将安装 peerDependencies 块中列出的依赖项。 (我不确定这种行为是从 npm 8.0 还是一些以前的版本开始的)

    那么,为什么我认为 npm 会同时安装 devDependencies 和依赖项?

    当我使用nodejs:14 图像时,我将某些依赖项从依赖项块移动到了devDependencies 块。所以,当我升级到nodejs:16 时,这些依赖项返回了。

    实际上,他们回来的原因是因为它们在内部被一个依赖项(传递依赖项)使用,该依赖项列在package.jsonpeerDependency 块中。

    那么,总结课?

    确保您要删除的依赖项没有在 dependencypeerDependency 块内直接或传递地使用。

    【讨论】:

    • 如果 express 使用我的 types 模块作为对等依赖项会很有趣。
    【解决方案3】:

    package-lock.json 文件存在时,npm 似乎忽略了 --production(或等效)标志。

    【讨论】:

      猜你喜欢
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      相关资源
      最近更新 更多