You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器切换用户后SSH密钥克隆Git仓库失败问题

解决切换用户后SSH克隆Git失败的方案

问题根源

切换到john用户后Git克隆失败,核心原因是:

  • Docker的--mount=type=ssh默认将SSH代理socket挂载到root用户的专属路径,john用户无权限访问该路径
  • 切换用户后,SSH_AUTH_SOCK环境变量丢失,导致Git无法定位SSH代理

解决方案

修改Dockerfile,确保john用户能访问SSH代理socket并正确配置Git的SSH环境:

修改后的Dockerfile

# syntax=docker/dockerfile:experimental
FROM python:3.10-bullseye
ARG APP_PATH=/opt/app

# 预加载Bitbucket的SSH主机密钥,避免首次克隆时的确认提示
RUN mkdir -p /etc/ssh && ssh-keyscan bitbucket.org > /etc/ssh/ssh_known_hosts

# 创建john用户并设置工作目录权限
RUN useradd -ms /bin/bash -u 999 john
RUN mkdir "$APP_PATH" && chown john:john -R "$APP_PATH"

# 配置全局可访问的SSH代理路径,确保john有权限访问
RUN mkdir -p /run/ssh-auth && chmod 777 /run/ssh-auth
ENV SSH_AUTH_SOCK=/run/ssh-auth/socket

WORKDIR $APP_PATH
USER john

COPY --chown=john:john . .

# 挂载SSH代理到指定路径,执行Git克隆
RUN --mount=type=ssh,target=$SSH_AUTH_SOCK git clone git@bitbucket.org:workspace/repo.git

关键修改说明

  • 创建全局可访问的/run/ssh-auth目录并开放权限,让john用户能读写其中的socket文件
  • 通过ENV指令固定SSH_AUTH_SOCK路径,确保切换用户后环境变量不丢失
  • 在--mount=type=ssh中指定target参数,将SSH代理socket挂载到john可访问的路径

构建命令保持不变

docker build --ssh default -t app2:latest -f Dockerfile .

可选简化方案

如果不想配置全局目录,也可以在root用户下调整代理socket的权限(依赖主机代理权限配置,兼容性稍弱):

# 在创建john用户后添加以下指令
RUN --mount=type=ssh chown john:john $SSH_AUTH_SOCK

内容的提问来源于stack exchange,提问作者Saikiran Jetti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:40:10