如何在Dockerfile中安装BitBucket来源的node_modules且不泄露git凭证
可用凭证类型
- 个人访问令牌(PAT,BitBucket官方推荐):仅需配置仓库读取权限,可单独设置有效期、随时回收,无需修改现有package.json的依赖地址。
- SSH私钥:适合已有SSH访问BitBucket仓库的场景,需要将package.json中的依赖地址调整为SSH协议格式(
git+ssh://git@bitbucket.org/some-module.git)。
推荐方案:使用PAT+Docker BuildKit密钥传入(无凭证残留、无需改package.json)
第一步:生成BitBucket PAT
进入BitBucket个人设置的「个人访问令牌」页面,创建新令牌,仅勾选仓库读取权限即可,生成后复制令牌值妥善保存。
第二步:修改Dockerfile
调整npm安装步骤,通过BuildKit的secret功能挂载凭证,临时配置git全局鉴权规则:
FROM node:14.4.0 WORKDIR /usr/src/app COPY ./package*.json ./ # 挂载构建密钥,临时配置git鉴权后执行依赖安装 RUN --mount=type=secret,id=bitbucket_pat \ git config --global url."https://x-token-auth:$(cat /run/secrets/bitbucket_pat)@bitbucket.org/".insteadOf "https://bitbucket.org/" \ && npm install \ && git config --global --unset url."https://x-token-auth:*@bitbucket.org/".insteadOf COPY ./ .
第三步:执行构建命令
构建前将PAT存入环境变量,启用BuildKit并传入密钥,凭证不会写入镜像层:
# 提前将PAT写入环境变量(可先执行export HISTCONTROL=ignorespace,命令前加空格避免记录到命令历史) export BITBUCKET_PAT=你生成的PAT值 # 执行构建 DOCKER_BUILDKIT=1 docker build --secret id=bitbucket_pat,env=BITBUCKET_PAT -t 你的镜像名 .
备选方案:使用SSH私钥
如果偏好SSH鉴权,可按以下操作:
- 将package.json中的依赖地址改为SSH格式:
"some-module": "git+ssh://git@bitbucket.org/some-module.git" - 修改Dockerfile的npm安装步骤:
RUN --mount=type=secret,id=bitbucket_ssh_key \ mkdir -p /root/.ssh \ && echo "$(cat /run/secrets/bitbucket_ssh_key)" > /root/.ssh/id_rsa \ && chmod 600 /root/.ssh/id_rsa \ && ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts \ && npm install \ && rm -rf /root/.ssh
- 构建命令:
DOCKER_BUILDKIT=1 docker build --secret id=bitbucket_ssh_key,src=你本地的SSH私钥路径 -t 你的镜像名 .
注意事项
不要使用ARG参数传递凭证,ARG值会永久保存在镜像的构建历史中,存在凭证泄露风险。
内容的提问来源于stack exchange,提问作者Ken Yip
相关产品推荐
相关产品推荐

