ElasticBeanstalk上Docker构建失败:npm私有包401未授权
token权限或有效性问题
你硬编码的token可能存在以下问题:- 已过期:本地测试时token有效,但上传到Dockerfile后token过期,导致EB构建时认证失败
- 权限不足:该token未授予
read:packages权限,或没有访问目标私有仓库的权限(比如仓库属于组织,token未加入对应组织权限组) - 输入错误:硬编码时存在字符拼写错误,本地测试用的是正确token,但Dockerfile里的token有误
构建环境的用户上下文差异
本地构建时Docker以root用户执行,生成的/root/.npmrc能被npm正常读取;但ElasticBeanstalk的构建环境可能存在特殊配置,导致Docker构建过程中实际运行的用户并非root,此时~/.npmrc会指向非root用户的home目录,npm无法读取到正确的token配置。项目目录中存在冲突的.npmrc文件
你执行COPY . /app/会将本地项目所有文件复制到镜像中,如果项目根目录本身存在一个.npmrc文件(可能本地被.dockerignore排除,但EB拉取的Git仓库中包含该文件),npm会优先使用项目根目录的.npmrc而非用户目录的配置。若项目内的.npmrc未配置GitHub token,就会触发认证失败。ElasticBeanstalk网络访问限制
AWS ElasticBeanstalk的构建环境可能处于受限制的VPC网络中,出站流量被防火墙或安全组规则拦截,导致无法正常访问GitHub的npm私有仓库。这种情况下,请求会因网络问题返回401 Unauthorized(部分场景下网络错误会被误判为认证失败)。环境变量被意外覆盖
ElasticBeanstalk默认会将平台配置的环境变量传递给Docker构建过程,如果你的EB应用中配置了同名的CI_GITHUB_TOKEN环境变量(值为空或无效),会覆盖Dockerfile中硬编码的变量值,导致生成的.npmrc使用了错误的token。
内容的提问来源于stack exchange,提问作者lordZ3d

