切换node:14-alpine到node:16-alpine后npm install git+ssh失败如何解决
问题根本原因
你遇到的问题确实是npm版本升级导致的,核心差异来自npm v7+(node:16-alpine默认搭载npm v8)的两个默认配置变更:
- root用户下执行npm命令时,
unsafe-perm参数默认值从true改为false:npm会自动将子进程(包括拉取git依赖的git进程)的执行用户切换为nobody,该用户无权限访问BuildKit挂载的SSH凭证套接字,也无权限读取/root/.ssh目录下的配置。 - npm执行子命令时会主动清理大部分继承的系统环境变量,其中就包括BuildKit注入的
SSH_AUTH_SOCK变量,该变量指向SSH agent的通信套接字,是BuildKit SSH身份验证的核心依赖。
可行解决办法
直接修改Dockerfile中npm安装的命令,加上--unsafe-perm参数即可:
RUN --mount=type=ssh npm i --unsafe-perm
如果单独加上述参数仍不生效,可以同时显式保留SSH_AUTH_SOCK环境变量、配置git的ssh命令:
RUN --mount=type=ssh \ SSH_AUTH_SOCK=$SSH_AUTH_SOCK \ npm i --unsafe-perm \ --git-config="sshCommand='ssh -o IdentityAgent=$SSH_AUTH_SOCK'"
补充说明
你观察到正常工作的版本中执行ssh -Tv git@github.com会失败,是因为只有声明了--mount=type=ssh的RUN步骤才会临时挂载SSH凭证、注入SSH_AUTH_SOCK变量,其他无该声明的步骤本身就没有SSH访问权限,属于正常现象。
内容的提问来源于stack exchange,提问作者grahamrhay
相关产品推荐
相关产品推荐

