Docker npm install --production 不工作

Docker npm install --production not working

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

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

对于 alpine nodejs 版本 14,该标志按预期工作并且开发依赖项未安装到容器中。 alpine 节点版本 16 图像有问题吗?谢谢

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

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

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

在这个问题上苦苦挣扎了几个星期之后,我终于找到了根本原因,不注意这一点真是愚蠢,我不希望其他人犯同样的错误。由于代码是专有的,我不能分享它。不过我会说明问题的。

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

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

那么,为什么我认为 npm 既要安装 devDependencies 又要安装依赖项?

当我使用 nodejs:14 图像时,我将某些依赖项从 dependencies 块移动到 devDependencies 块。所以,当我升级到 nodejs:16 时,那些依赖关系又回来了。

实际上,它们返回的原因是它们被一个依赖项(传递依赖项)内部使用,该依赖项列在 package.json.

peerDependency 块中

所以,带回家的课?

确保您要删除的依赖项不会在 dependencypeerDependency 块中直接或传递使用。

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