带有 Docker 和 shell 错误的 Gitlab Runner — 权限被拒绝

Posted

技术标签:

【中文标题】带有 Docker 和 shell 错误的 Gitlab Runner — 权限被拒绝【英文标题】:Gitlab Runner with Docker and shell error — Permission denied 【发布时间】:2021-05-29 13:55:54 【问题描述】:

在 Ubuntu Server 20.04.2.0 上安装了全新的 Gitlab CE 13.9.1。 这是管道

image: node:latest

before_script:
  - apt-get update -qq

stages:
  - install

install:
  stage: install
  script:
    - npm install --verbose

为了运行它,我使用与我之前的 Gitlab CE 12 相同的过程来配置我的 Gitlab Runner:

我拉出最后一张 Gitlab runner 图像:

docker pull gitlab/gitlab-runner:latest

第一次尝试:

在本地卷上启动 GitLab Runner 容器挂载

docker run -d \
--name gitlab-runner \
--restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest

并注册跑步者

docker run --rm -t -i \
-v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register

注册runner时,executor我选择shell

最后,当我推送到 Gitlab 时,在管道上,我看到了这个错误:

$ apt-get update -qq
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
ERROR: Job failed: exit status 1

第二次尝试:

在 Docker 卷上启动 GitLab Runner 容器挂载

    创建卷
docker volume create gitlab-runner-config
    启动 GitLab Runner 容器
docker run -d \
--name gitlab-runner \
--restart always \
-v gitlab-runner-config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
    注册runner(再次选择shell作为executor)
docker run \
--rm -t -i \
-v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner register

同样的结果。

$ apt-get update -qq
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
ERROR: Job failed: exit status 1

第三次尝试:

授予 gitlab-runner 权限

我最终阅读了In gitlab CI the gitlab runner choose wrong executor 和https://docs.gitlab.com/runner/executors/shell.html#running-as-unprivileged-user,其中说明了这些解决方案:

    移至码头 授予用户 gitlab-runner 运行指定命令所需的权限。 gitlab-runner 可以在没有 sudo 的情况下运行 apt-get,他还需要 perms 才能进行 npm install 和 npm run。 将 sudo nopasswd 授予用户 gitlab-runner。将 gitlab-runner ALL=(ALL) NOPASSWD: ALL (或类似) 添加到安装了 gitlab-runner 的机器上的 /etc/sudoers 并将 apt-get update 行更改为 sudo apt-get update,这将作为特权执行它们用户(root)。
    我需要使用shell 我已经用 sudo usermod -aG docker gitlab-runner 做到了 也尝试使用sudo nano /etc/sudoers,添加gitlab-runner ALL=(ALL) NOPASSWD: ALL,并在管道中使用sudo apt-get update -qq,结果为bash: line 106: sudo: command not found

我现在很迷茫。欢迎任何想法。

【问题讨论】:

【参考方案1】:

恕我直言,在已安装 Docker 套接字的 Docker 运行器上使用 shell 执行程序不是一个好主意。你最好使用docker executor,它会处理所有事情,并且可能是它应该运行的方式。

编辑

或者,您可以使用自定义的 Docker 映像来允许使用具有 root 权限的 shell 执行程序。首先,您需要创建一个Dockerfile

FROM gitlab/gitlab-runner:latest
# Change user to root
USER root

然后,您必须构建图像(在这里,我将其标记为custom-gitlab-runner):

$ docker build -t custom-gitlab-runner .

最后,你需要使用这张图片:

docker run -d \
  --name gitlab-runner \
  --restart always \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  custom-gitlab-runner:latest

【讨论】:

如问题中所述,shell 是一项要求。 这不是要求。此外,您正在配置所有内容,就好像您要使用 docker 执行程序(在 Docker 中使用 Docker)一样。 请参考题名。我知道管道的配置,就好像我要与 docker executor 一起使用它一样;这里有趣的是,我让它使用带有 shell 执行器的 Gitlab Runner 12 运行这个管道。应该这样工作,我很确定我做错了什么。 Please refer to the title of the question 也没有将其作为要求。发布的解决方案至少是一个足够的解决方案,因为它修复了错误(只需将shell 更改为docker,一切都会正常工作)。否决票不公平,或编辑您的问题并确保将shell 声明为要求(这将难以理解,但将是您的具体问题)。 你是有道理的,无论如何编辑答案,这样我就可以取消投票了

以上是关于带有 Docker 和 shell 错误的 Gitlab Runner — 权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

linux命令自动补全工具bash-completion,自动补全git、Docker、kubenetes等命令

Git错误解决(windows版本下的Git Shell)

Git push 执行不需要的 Gitlab runner

在 Docker 中,git-lfs 给出错误:https://github.... 的凭据未找到

带有 Git 集成的错误跟踪器设置? [关闭]

错误:docker-ce conflicts with 2:docker-1.13.1-74.git