如何通过docker-compose将SSH代理转发到容器以拉取Git依赖?
问题排查与解决方案
遗漏的配置项
- 构建阶段与运行阶段配置隔离
你在docker-compose.yml中配置的SSH代理挂载、环境变量仅作用于容器运行阶段,而pip拉取Git依赖是在镜像构建阶段执行的,构建阶段默认无法访问运行阶段的挂载资源,所以构建过程找不到SSH代理,自然拉取失败。 - 未配置目标Git服务的主机公钥
Host key verification failed报错是因为SSH连接时会校验目标主机的公钥是否在本地known_hosts文件中,容器内默认没有存储bitbucket.org的公钥,SSH会拒绝未授信的主机连接。 - 未开启构建阶段的SSH代理权限
Docker默认不会将宿主机的SSH代理暴露给构建过程,需要通过BuildKit的SSH挂载功能显式授权。
具体修复步骤
- 开启Docker BuildKit支持,在执行构建命令前先设置环境变量:
export DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1
- 修改docker-compose.yml的build配置,开启构建阶段SSH权限:
#docker-compose.yml services: web: build: context: . ssh: - default # 挂载宿主机默认SSH代理到构建过程 command: python manage.py run -h 0.0.0.0 # 运行阶段需要SSH的话保留原有配置 volumes: - $SSH_AUTH_SOCK:/ssh-agent environment: SSH_AUTH_SOCK: /ssh-agent
- 修改Dockerfile,安装SSH客户端、预添加bitbucket公钥、配置构建阶段SSH挂载:
# 前置步骤省略,安装基础依赖后执行以下操作 RUN apt-get update && apt-get install -y --no-install-recommends openssh-client && rm -rf /var/lib/apt/lists/* # 预添加bitbucket.org的公钥到授信列表 RUN mkdir -p /root/.ssh && \ ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts && \ chmod 700 /root/.ssh && chmod 600 /root/.ssh/known_hosts # 构建时挂载SSH代理,执行依赖安装 RUN --mount=type=ssh pip install -r requirements.txt
SSH代理转发的作用
SSH代理转发可以让远端环境(此处为Docker容器)直接使用本地宿主机上已加载的SSH密钥完成身份认证,不需要将私钥复制到远端环境中,全程私钥不会离开本地机器,既避免了私钥泄露的风险,也省去了在多个远端环境配置密钥的重复工作。
内容的提问来源于stack exchange,提问作者tbarbot
相关产品推荐
相关产品推荐

