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

