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
块中
所以,带回家的课?
确保您要删除的依赖项不会在 dependency
和 peerDependency
块中直接或传递使用。
当 package-lock.json
文件存在时,npm 似乎忽略了 --production(或等效)标志。
我有一个 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
块中
所以,带回家的课?
确保您要删除的依赖项不会在 dependency
和 peerDependency
块中直接或传递使用。
当 package-lock.json
文件存在时,npm 似乎忽略了 --production(或等效)标志。