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

如何在Docker构建时使用Deploy Key从Github拉取代码?

解决Docker构建中ssh-agent无法持续工作的问题

嘿,我完全懂你碰到的麻烦!Docker的每个RUN指令都是在独立的临时容器里执行的——这意味着你第一个RUN启动的ssh-agent进程,到第二个RUN执行时,那个临时容器已经被销毁了,agent进程自然也不存在了,所以ssh-add根本没法找到之前启动的agent。

问题根源拆解

Docker的镜像构建是分层的,每一条RUN都会创建一个新的镜像层,而每个层对应的容器都是独立的,进程、环境变量都不会在层之间共享。你启动的ssh-agent只在第一个RUN的容器生命周期内存在,一旦这个容器被删除(构建完该层后Docker会自动清理),agent就没了,后续的ssh-add自然失效。

解决方案1:合并相关命令到同一个RUN

把ssh-agent启动、密钥添加、代码拉取甚至密钥清理都放在同一个RUN指令里,这样所有操作都在同一个容器进程中完成:

FROM python:2.7-stretch

# 添加密钥后先修正权限(ssh要求私钥权限是600)
ADD ./id_rsa /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa && \
    eval "$(ssh-agent -s)" && \
    ssh-add /root/.ssh/id_rsa && \
    # 这里执行你的代码拉取命令,比如git clone
    git clone git@github.com:your-username/your-target-repo.git && \
    # 关键:拉取完成后删除私钥,避免泄露到镜像里
    rm -rf /root/.ssh/id_rsa /root/.ssh/id_rsa.pub

解决方案2:用Docker BuildKit Secrets(更安全)

如果不想把私钥写到镜像层里(哪怕之后删除,镜像历史里还是能找到),推荐用Docker BuildKit的secret功能,它会临时挂载密钥,构建完成后自动清理:

首先确保启用BuildKit,然后编写Dockerfile:

# syntax=docker/dockerfile:1
FROM python:2.7-stretch

# 先安装ssh客户端(基础镜像可能没有)
RUN apt-get update && apt-get install -y --no-install-recommends openssh-client && \
    rm -rf /var/lib/apt/lists/*

# 创建ssh目录并设置正确权限
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh

# 临时挂载ssh密钥,执行代码拉取
RUN --mount=type=ssh git clone git@github.com:your-username/your-target-repo.git

然后用以下命令构建:

DOCKER_BUILDKIT=1 docker build --ssh default=./id_rsa .

额外注意事项

  • 确保你的id_rsa文件权限是600,不然ssh会拒绝使用它(本地可以先执行chmod 600 ./id_rsa)
  • 如果是私有仓库,记得先把github的主机公钥加到known_hosts里,可以在RUN里添加ssh-keyscan github.com >> /root/.ssh/known_hosts避免首次连接的确认提示

内容的提问来源于stack exchange,提问作者Harsh M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:04:16