【问题标题】:jenkins 'execute script' build step Error: /bin/docker: Permission deniedjenkins“执行脚本”构建步骤错误:/bin/docker:权限被拒绝
【发布时间】:2018-07-26 17:11:07
【问题描述】:

我试图在我的个人电脑上构建一个简单的管道。我有詹金斯版本。 2.32.2 安装并运行。以下是我的管道的工作 dsl:

node {
    stage('Github Checkout') {
        checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '921fd840-1d71-4b06-bf5e-1c6f3141f669', url: 'git@github.com:justinsr20/tdd_django.git']]])
    }
    stage('Build container image') {
        sh 'whoami'
    }
    stage('Build container image') {
        sh 'pwd'
    }
    stage('Build container image') {
        sh 'ls -l'
    }

    stage('Build container image') {
        sh 'docker build -t jenkins/django:v1 -t jenkins/django:latest .'
    }
}

我已经安装了 docker,并且我在 docker 组中有 jenkins 用户:

[root@localhost bin]# grep 'docker' /etc/group
docker:x:977:judd,jenkins

奇怪的是,当我尝试在上面定义的管道中运行 docker build 命令时,jenkins 给了我以下权限错误:

[workspace] Running shell script
+ whoami
jenkins
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build container image)
[Pipeline] sh
[workspace] Running shell script
+ pwd
/var/lib/jenkins/jobs/tdd_django/workspace
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build container image)
[Pipeline] sh
[workspace] Running shell script
+ ls -l
total 20
drwxr-xr-x. 3 jenkins jenkins 4096 Feb 10 11:11 django_app
-rw-r--r--. 1 jenkins jenkins   97 Feb 10 12:37 Dockerfile
-rw-r--r--. 1 jenkins jenkins   15 Feb 10 11:11 requirements.txt
-rw-r--r--. 1 jenkins jenkins   66 Feb 10 11:11 run_tests.sh
-rwxr-xr-x. 1 jenkins jenkins   69 Feb 10 12:48 script.sh
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build container image)
[Pipeline] sh
[workspace] Running shell script
+ docker build -t jenkins/django:v1 -t jenkins/django:latest .
/var/lib/jenkins/jobs/tdd_django/workspace@tmp/durable-77854956/script.sh: line 2: /bin/docker: Permission denied

我的 docker 权限:

bash-4.3$ which docker
/bin/docker
bash-4.3$ ls -la /bin/docker
-rwxr-xr-x. 1 root root 12056512 Feb  8 16:44 /bin/docker

但是当我以 jenkins 用户身份打开 shell 会话时,我可以毫无问题地运行命令:

[root@localhost bin]# sudo su -s /bin/bash jenkins
bash-4.3$ cd /var/lib/jenkins/jobs/tdd_django/workspace
bash-4.3$ ls
django_app  Dockerfile  requirements.txt  run_tests.sh  script.sh
bash-4.3$ docker build -t jenkins/django:v1 -t jenkins/django:latest .
Sending build context to Docker daemon  76.8 kB
Step 1/3 : FROM python:2.7-onbuild
# Executing 3 build triggers...
Step 1/1 : COPY requirements.txt /usr/src/app/
 ---> Using cache
Step 1/1 : RUN pip install --no-cache-dir -r requirements.txt
 ---> Using cache
Step 1/1 : COPY . /usr/src/app
 ---> Using cache
 ---> fb9aa7078336
Step 2/3 : LABEL maintainer "CMI Industries"
 ---> Using cache
 ---> c1888038ffa2
Step 3/3 : RUN chmod +x /usr/src/app/run_tests.sh
 ---> Using cache
 ---> 8e61860e0567
Successfully built 8e61860e0567

任何帮助将不胜感激。

编辑更新:

所以如果 issues.jenkins-ci.org/browse/JENKINS-24338 是相关的,我需要修改 docker 服务的启动方式。我使用以下方式启动我的 docker 服务:

systemctl start docker

找到我使用的这个命令的配置文件:

[root@localhost system]# systemctl show --property=FragmentPath docker
FragmentPath=/usr/lib/systemd/system/docker.service

以及这个文件的内容:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target firewalld.service

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process

[Install]
WantedBy=multi-user.target

我不确定我需要如何修改此文件,以便“配置 docker 服务以将 'jenkins' 组所有权应用于套接字,而不是将 jenkins 用户添加到默认使用的 'docker' 组”,如问题中所述.jenkins-ci.org/browse/JENKINS-24338

【问题讨论】:

  • 如果在 sudo 测试中使用 sh 而不是 bash 会怎样?
  • [root@localhost bin]# sudo su -s /bin/sh jenkins sh-4.3$ type docker docker is /bin/docker
  • 你已经检查了所有明显的东西,它应该可以工作。我看到在目录列表中设置了一个 selinux 位,如果它没有被禁用,我会尝试下一个。
  • 嘿 Nehal 我想你可能会对那篇文章有所了解。我只是注意确定如何为 Fedora 修改 /usr/lib/systemd/system/docker.service。正如最后一条评论为centos 提到的,但我在该文件中没有 SocketGroup 设置。我已经编辑了主帖

标签: jenkins docker


【解决方案1】:

好像你遇到了selinux。运行命令sestatus 会让你知道它处于什么模式。在你的情况下,这将是enforcing

为了获得更多关于您需要添加哪些规则以使 selinux 满意的更多信息,我建议您通过编辑以下文件将 selinux 设置为 permissive/etc/sysconfig/selinux 然后重新启动。我相信还有一种方法可以在不重新启动的情况下更改模式(尽管它不是永久性的)。

一旦 selinux 处于 permissive 模式(它只会记录而不阻塞),您可以在运行 jenkins 作业时跟踪 /var/log/audit/audit.log 中的日志。这应该让您了解它需要什么权限。

【讨论】:

  • 嗨 gbolo 感谢您的回复。我尝试了建议的解决方案,但仍然收到相同的错误消息
  • 是否启用了 selinux 或 apparmor?
  • 您好 gbolo,我禁用了 selinux,它现在可以成功运行谢谢 :) 我唯一关心的是禁用 selinux 的后果是什么?我通过修改 /etc/sysconfig/selinux 并将 seling 更改为 SELINUX=disbaled 来禁用它。不确定是否有更细粒度的方法来做到这一点?
  • 嗨贾斯汀,selinux 有点超出了这个问题的范围。它基本上是一个提供细粒度访问控制的内核模块。您需要添加规则以允许詹金斯采取它想要的行动。我建议您设置 set SELINUX=permissive 并在运行 jenkins 作业时查看 selinux 日志以了解它需要什么样的访问权限。请将我的回答标记为已接受,如果您觉得它有用,请点赞。
  • 嘿 gbolo,我一定会看看的。您能否编辑您的答案以仅谈论 selinux,因为创建 daemon.json 文件对我不起作用。然后我很乐意投票:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 2020-05-24
  • 2016-09-05
  • 2019-11-22
  • 2016-05-20
  • 1970-01-01
相关资源
最近更新 更多