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

Docker镜像构建时非root用户无法通过SSH克隆Git仓库

问题背景

Docker主机为Debian 12.2,主机可通过SSH正常克隆私有Git仓库。镜像构建时已转发主机SSH代理,root用户构建过程中克隆操作正常,但切换为非root用户后克隆失败。项目要求必须使用非root用户,且禁止将SSH密钥复制到镜像中。

解决方法

核心问题是SSH代理挂载默认仅对root用户可见,非root用户需配置权限与环境变量才能访问代理。以下是具体修正方案:

关键修改点

  1. 修正用户与组创建逻辑:确保非root用户的UID/GID与主机用户一致,且目录权限正确
  2. 调整SSH代理挂载权限:挂载时指定非root用户的UID/GID,让其能访问代理socket
  3. 显式设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 11:27:45