为何Dockerfile中RUN npm install @types/node无法安装@types/node?
核心问题出在NODE_ENV=production环境下npm的安装逻辑,以及@types/node包的默认归类:
production模式的npm行为
当NODE_ENV=production时,npm会自动启用--omit=dev参数,安装时会跳过所有devDependencies中的包。@types/node的默认安装类型
npm对@types/*开头的类型定义包有默认规则:即使你不添加--save-dev参数,npm也会自动将这类包归类为devDependency。
第一个Dockerfile失效的原因
你先执行了RUN npm install(production模式,仅安装dependencies),之后单独运行RUN npm install @types/node时,npm会自动把@types/node标记为devDependency,受--omit=dev限制,这个包不会被实际安装到node_modules中,自然就没有@types/node文件夹。
把这条命令放到COPY ./ ./之后也无效,是因为本地的package.json里@types/node大概率本来就是devDependency,production模式下依然会被npm跳过。
第二个Dockerfile生效的原因
先执行RUN npm uninstall @types/node会清除package.json中@types/node的条目(不管之前有没有安装过),之后再执行RUN npm install @types/node时,npm会重新处理这个包的归类——要么将其添加到dependencies(生产依赖),要么强制绕过--omit=dev的限制,最终成功完成安装。
- 显式指定将
@types/node安装为生产依赖:RUN npm install @types/node --save - 临时切换到development环境安装:
RUN NODE_ENV=development npm install @types/node - 本地提前调整依赖类型:在项目的
package.json里把@types/node从devDependencies移到dependencies,这样npm install在production模式下会自动安装它。
内容的提问来源于stack exchange,提问作者Dm Prkp

