Docker容器内执行yarn install报自签名证书链错误如何解决
问题根因
容器构建环境和宿主机是完全隔离的,你在宿主机上给Docker配置的信任存储、给宿主机yarn设置的NODE_EXTRA_CA_CERTS参数,都不会自动传入构建阶段的容器内部。容器内执行yarn install拉取依赖时,无法识别企业内网的自签名CA,才会抛出"self signed certificate in certificate chain"错误。
你之前的临时方案本质是绕开了容器内的依赖下载流程,把本地装好的依赖直接拷进镜像,虽然能跑通构建,但存在本地依赖和容器Node版本不兼容、构建流程无法标准化复现的问题,不适合生产环境使用。
标准修复方案
你的思路是对的,需要把PEM格式的企业内网CA证书传入构建容器,同时配置对应的证书信任参数,具体操作步骤:
- 把企业内网根CA证书(PEM格式,建议命名为
corp-ca.pem)放到项目根目录,和Dockerfile同级,记得把该证书加入.gitignore,避免泄露内部证书 - 修改Dockerfile,在执行yarn命令前完成证书配置,同时优化依赖层缓存提升构建速度,参考配置如下:
FROM node:15.13-alpine WORKDIR /react # 配置系统级CA信任 COPY corp-ca.pem /usr/local/share/ca-certificates/corp-ca.crt RUN apk add --no-cache ca-certificates && \ update-ca-certificates && \ # 配置yarn全局信任该证书 yarn config set cafile /usr/local/share/ca-certificates/corp-ca.crt -g # 配置Node进程全局信任该证书,覆盖所有Node生态工具(yarn、node脚本等) ENV NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/corp-ca.crt # 先拷贝依赖描述文件,利用Docker层缓存,后续代码变更不需要重新安装依赖 COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile # 拷贝全量项目代码执行构建 COPY . . RUN yarn run build
- 保持原有
.dockerignore配置即可,继续排除node_modules和build目录,不要把本地的node_modules传入容器,避免出现跨平台原生依赖兼容问题。
避坑提示
- 不要通过
yarn config set strict-ssl false关闭SSL校验来绕过问题,该方式会完全跳过HTTPS证书校验,存在中间人攻击风险,不符合企业内网安全规范 - 如果后续采用多阶段构建精简镜像,只需要在执行yarn构建的阶段配置CA证书即可,最终运行镜像如果不需要访问内网HTTPS服务,不需要重复配置证书,可以有效减小镜像体积
- 传入的证书必须是PEM编码格式,如果现有证书是DER二进制格式,需要先转换为PEM格式再使用,否则会出现证书加载失败的问题
内容的提问来源于stack exchange,提问作者cpage
相关产品推荐
相关产品推荐

