容器中安装私有npm包出现404错误,寻求解决方法
以下是几个可能导致问题的原因及排查点:
.yarnrc私有源配置错误
错误日志显示请求指向了公共npm源https://registry.npmjs.org,说明容器内的.yarnrc未正确绑定私有包的专属源。检查容器内的.yarnrc内容,确认是否存在类似@some-private-package:registry=https://你的私有仓库地址的配置——如果本地有这条配置但容器内没有,或者地址写错,就会导致yarn去公共源找私有包,自然找不到。NPM_TOKEN未在运行时传递
构建参数传入的NPM_TOKEN仅在镜像构建阶段有效,而docker-compose run是在容器运行时执行命令,此时环境变量可能未被正确传递。检查你的docker-compose.yml,确保在对应service的environment字段中配置了NPM_TOKEN=${NPM_TOKEN},而非仅在build.args里设置。私有仓库认证方式不匹配
不同私有仓库的认证要求可能不同:比如GitHub Packages需要的是GH_TOKEN而非NPM_TOKEN,部分仓库要求.yarnrc里的认证格式为//你的私有仓库地址/:_authToken=${NPM_TOKEN}。如果认证令牌类型或格式不对,会导致无法访问私有源,最终fallback到公共源请求。.yarnrc环境变量未被解析
若你的.yarnrc中使用了${NPM_TOKEN}这类变量占位符,需确保容器内的yarn版本支持变量插值,或者通过entrypoint脚本在容器启动时动态替换占位符为实际令牌值。直接复制本地.yarnrc到容器的话,shell可能不会解析这些变量,导致认证令牌为空,进而访问私有源失败。容器网络无法连通私有源
容器所在网络(比如默认bridge网络)可能无法访问私有仓库地址,而本地网络可以正常访问。可以在容器内执行curl https://你的私有仓库地址/@some-private-package测试连通性,确认是否能正常获取包信息。
内容的提问来源于stack exchange,提问作者Darth Vader

