Docker构建中SSH连接GitHub失败,请求排查问题
Docker BuildKit构建时SSH连接GitHub失败排查方案
问题背景
- 本地路径
~/.ssh/id_ed25519_docker下有已添加到GitHub的无密码私钥,本地执行ssh -i ~/.ssh/id_ed25519_docker -vT git@github.com可正常完成认证。 - 构建命令:
export DOCKER_BUILDKIT=1; docker build --ssh default=~/.ssh/id_ed25519_docker . - Dockerfile最后一步执行
RUN ssh -vT git@github.com失败,错误为git@github.com: Permission denied (publickey),调试日志未尝试指定私钥;修改指令为RUN ssh -i ~/.ssh/id_ed25519_docker -vT git@github.com后,出现警告Identity file /root/.ssh/id_ed25519_docker not accessible: No such file or directory。 - Docker Client API版本:1.41
解决步骤
1. 给RUN指令添加SSH挂载参数
BuildKit不会自动将SSH私钥复制到容器内,需要通过--mount=type=ssh参数将本地SSH代理转发到构建容器中。修改Dockerfile中的RUN指令:
# 先确保基础镜像安装了openssh-client(如果基础镜像没有的话) RUN apt-get update && apt-get install -y --no-install-recommends openssh-client && rm -rf /var/lib/apt/lists/* # 使用--mount=type=ssh挂载SSH代理 RUN --mount=type=ssh ssh -vT git@github.com
此参数会自动关联构建命令中--ssh default=...指定的私钥,无需手动复制私钥到容器。
2. 验证容器内SSH代理状态
添加调试指令确认代理是否正常挂载:
RUN --mount=type=ssh \ echo "SSH_AUTH_SOCK路径: $SSH_AUTH_SOCK" && \ ssh-add -l
如果输出包含你的id_ed25519_docker私钥指纹,说明代理挂载成功。
3. 配置SSH客户端自动使用代理
创建容器内的SSH配置文件,让git@github.com请求自动走代理:
RUN mkdir -p ~/.ssh && \ echo -e "Host github.com\n IdentityAgent $SSH_AUTH_SOCK" > ~/.ssh/config && \ chmod 600 ~/.ssh/config
这样后续的ssh git@github.com或Git克隆操作会自动使用代理中的私钥,无需手动指定-i参数。
4. 确认BuildKit启用状态
确保DOCKER_BUILDKIT=1环境变量生效,也可以通过修改Docker配置文件永久启用:
编辑/etc/docker/daemon.json(不存在则新建):
{ "features": { "buildkit": true } }
保存后重启Docker服务:
sudo systemctl restart docker
5. 检查本地私钥权限
本地私钥权限必须为600,否则BuildKit无法读取:
chmod 600 ~/.ssh/id_ed25519_docker
确保私钥为无密码类型,若有密码,需提前通过ssh-add ~/.ssh/id_ed25519_docker添加到本地SSH代理(构建时可能需要输入密码,建议使用无密码私钥)。
内容的提问来源于stack exchange,提问作者BeetleJuice
相关产品推荐
相关产品推荐

