带有 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等命令