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

