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

GitLab Runner(Docker+Machine)无法访问~/.ssh/id_rsa求助

问题分析与解决办法

核心原因

你遇到的问题大概率是GitLab Runner执行Job时的用户和本地测试时的用户不一致:

  • 本地Docker Desktop CLI测试时默认以root用户进入容器,~指向/root,能找到Dockerfile生成的密钥文件;
  • 但GitLab Runner默认用gitlab-runner用户运行Job(或是你在Runner配置里指定的其他非root用户),此时~指向该用户的家目录(比如/home/gitlab-runner),自然找不到/root/.ssh下的文件。

验证方法

在.gitlab-ci.yml的before_script里加两行命令,确认当前运行的用户和家目录:

before_script:
   - whoami && echo $HOME
   - chmod 700 ~/.ssh
   - chmod 600 ~/.ssh/id_rsa
   - chmod 644 ~/.ssh/id_rsa.pub

运行Job后查看输出,如果显示用户是gitlab-runner、家目录是/home/gitlab-runner,就坐实了用户不一致的问题。

解决办法

方法1:修改Dockerfile适配GitLab Runner用户

直接在Dockerfile里创建gitlab-runner用户,并切换到该用户生成密钥,让镜像里的密钥存在Job使用的家目录下:

# syntax=docker/dockerfile:1

FROM python:3.9

RUN apt-get -y install openssh-client

# 创建gitlab-runner用户并生成家目录
RUN useradd -m gitlab-runner
# 切换到gitlab-runner用户
USER gitlab-runner

# 在该用户的家目录生成SSH密钥
RUN ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa

重新构建、推送镜像后,Job就能正常找到~/.ssh下的文件了。

方法2:检查GitLab Runner配置(可选)

如果你的Runner配置里强制指定了运行用户(比如config.toml的docker执行器配置了user = "xxx"),需要保证Dockerfile里的密钥生成在该用户的家目录下,或者调整Runner配置使用root用户(不推荐,安全性较低)。

方法3:直接使用绝对路径(不推荐)

如果一定要用root用户的密钥,可以在before_script里写绝对路径,但需要先给gitlab-runner用户授权访问/root/.ssh:

before_script:
   - chmod 755 /root
   - chmod 700 /root/.ssh
   - chmod 600 /root/.ssh/id_rsa
   - chmod 644 /root/.ssh/id_rsa.pub

这种方法会降低容器安全性,不建议使用。

内容的提问来源于stack exchange,提问作者Oscar Or

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:45:46