Docker Hub使用Git子模块自动构建时出现身份验证问题
问题根因
你遇到的两个报错分别对应两个独立的配置错误:
- 未添加SSH_PRIVATE时的
Host key verification failed是因为Docker构建内部的SSH环境没有预先添加Bitbucket的主机公钥,无法确认远程服务器合法性 - 添加SSH_PRIVATE后主仓库拉取失败,是因为
SSH_PRIVATE是Docker Hub自动构建流程的系统预留变量:你手动赋值后,系统会覆盖默认用于拉取主仓库的官方自动生成密钥,转而使用你传入的私钥拉取主仓库,就算你已经把对应公钥加到主仓库,也大概率因为Windows生成私钥的CRLF换行符无法被Linux环境识别,导致鉴权失败
解决方案
步骤1:调整构建环境变量配置
删除你之前在Docker Hub构建配置里添加的SSH_PRIVATE变量,新增名为BUILD_SSH_KEY的变量:
- 变量值为你生成的完整SSH私钥,必须包含
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----头尾标记 - 提前用文本编辑器把私钥的换行符从Windows默认的CRLF转为LF,再粘贴到变量值输入框
步骤2:修改Dockerfile配置
在git clone操作前添加SSH环境配置,克隆完成后立即销毁私钥避免残留到镜像中:
FROM python:3.9.7-buster AS builder # 声明构建时参数,接收外部传入的SSH私钥 ARG BUILD_SSH_KEY # 配置SSH环境:添加Bitbucket主机公钥、写入私钥并设置正确权限 RUN mkdir -p /root/.ssh && \ chmod 0700 /root/.ssh && \ # 写入Bitbucket官方公钥,避免主机验证失败 echo "bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQqlhJKYtL/r9655iwp5TiUM9Khp2DJtsWw19x85x5lXj2l9f4k1Hf0U9z9w7v6b5n4m3l2k1j0i9h8g7f6e5d4c3b2a1z0y9x8w7v6u5t4s3r2q1p0o9n8m7l6k5j4i3h2g1f0e9d8c7b6a5s4r3q2p1o0n9m8l7k6j5i4h3g2f1e0d9c8b7a6s5d4f3g2h1j0k9l8m7n6o5p4q3r2s1t0u9v8w7x6y5z" > /root/.ssh/known_hosts && \ echo "${BUILD_SSH_KEY}" > /root/.ssh/id_rsa && \ chmod 600 /root/.ssh/id_rsa RUN git clone \ --branch master \ --single-branch \ git@bitbucket.org:myorganisationname/dependency.git # 克隆完成后立即删除私钥,避免敏感信息泄露 RUN rm -rf /root/.ssh/ RUN pip wheel --no-cache-dir --wheel-dir /usr/src/app/wheels --use-feature=in-tree-build ./dependency [...]
注:上述文件中的Bitbucket公钥你可以本地执行
ssh-keyscan bitbucket.org获取最新官方值替换,避免公钥更新后失效。
步骤3:配置构建参数传递
在Docker Hub的对应构建规则中,找到Build environment variables区域,勾选BUILD_SSH_KEY对应的Build arg选项,确保环境变量的值可以传递给Docker构建过程的ARG参数。
可选排查点
如果按上述步骤配置后依然失败,请检查:
- 依赖仓库的访问密钥列表中,你添加的公钥已经勾选了读取权限
- 私钥粘贴时没有多余的首尾空格、换行符
- 主仓库的访问密钥列表中,Docker Hub自动生成的公钥没有被误删
内容的提问来源于stack exchange,提问作者Romn
相关产品推荐
相关产品推荐

