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
相关产品推荐
相关产品推荐

