Docker镜像构建时非root用户无法通过SSH克隆Git仓库
问题背景
Docker主机为Debian 12.2,主机可通过SSH正常克隆私有Git仓库。镜像构建时已转发主机SSH代理,root用户构建过程中克隆操作正常,但切换为非root用户后克隆失败。项目要求必须使用非root用户,且禁止将SSH密钥复制到镜像中。
解决方法
核心问题是SSH代理挂载默认仅对root用户可见,非root用户需配置权限与环境变量才能访问代理。以下是具体修正方案:
关键修改点
- 修正用户与组创建逻辑:确保非root用户的UID/GID与主机用户一致,且目录权限正确
- 调整SSH代理挂载权限:挂载时指定非root用户的UID/GID,让其能访问代理socket
- 显式设置SSH环境变量:确保git命令能找到SSH代理的socket路径
修改后的Dockerfile
FROM ubuntu:20.04 AS final-build SHELL ["/bin/bash", "-c"] ARG DEBIAN_FRONTEND=noninteractive # 安装依赖工具 RUN apt update && apt upgrade -y && apt install -y git # 创建非root用户(先建组再建用户,保证GID匹配) ARG USER ARG UID ARG GID RUN groupadd -g ${GID} ${USER} && \ useradd -m -u ${UID} -g ${GID} ${USER} USER ${USER} ARG GIT_SERVER ARG PROJECT # 创建.ssh目录并设置符合SSH要求的权限,添加Git服务器到已知主机 RUN mkdir -p ~/.ssh && \ chmod 700 ~/.ssh && \ ssh-keyscan ${GIT_SERVER} >> ~/.ssh/known_hosts && \ chmod 644 ~/.ssh/known_hosts ARG REPO=git@${GIT_SERVER}:<snip> ARG BRANCH WORKDIR ~/src # 挂载SSH代理时指定非root用户的UID/GID,并设置SSH_AUTH_SOCK环境变量 RUN --mount=type=ssh,uid=${UID},gid=${GID} \ export SSH_AUTH_SOCK=/run/buildkit/ssh_agent.0 && \ git clone --branch ${BRANCH} --single-branch ${REPO} ${PROJECT}
修改后的构建脚本
target="final-build" eval $(ssh-agent) ssh-add options="-f Dockerfile \ --build-arg GIT_SERVER=${GIT_SERVER} \ --build-arg PROJECT=${PROJECT} \ --build-arg BRANCH=${BRANCH} \ --build-arg USER=${USER} \ --build-arg UID=$(id -u) \ --build-arg GID=$(id -g) \ --ssh default -t test --progress=auto" docker buildx build --target=${target} ${options} .
说明
- 原构建脚本中
GID=$(id -u)是错误的,已修正为GID=$(id -g),确保组ID与主机用户一致 ~/.ssh目录权限设为700、known_hosts设为644,符合SSH的安全权限要求--mount=type=ssh,uid=${UID},gid=${GID}参数让非root用户拥有代理socket的访问权限- 显式设置
SSH_AUTH_SOCK环境变量,避免git因找不到代理路径而失败
内容的提问来源于stack exchange,提问作者Donotalo
相关产品推荐
相关产品推荐

