Jenkinsfile:在Docker容器中运行sh步骤时权限被拒绝

时间:2017-11-08 23:27:56

标签: shell docker jenkins groovy jenkins-pipeline

我无法运行简单的Jenkinsfile - 例如

pipeline {
    agent { label 'ssh-slave' } 
    stages {
        stage('Shell Test') {
            steps {
                sh 'echo "Hello World"'
            }
        }
    }
}

主服务器上Jenkins的日志文件显示容器已成功启动,但构建作业因

之类的消息而崩溃
sh: 1: /home/jenkins/workspace/pipeline@tmp/durable-34c21b81/script.sh: Permission denied

以下是我们配置/想出的一些其他内容:

  1. 我们正在使用RHEL

  2. 的VM上运行代理
  3. 我们正在使用Jenkins的jenkinsci/ssh-slave Docker image在单独的Jenkins代理上启动/管理容器

  4. 我们使用Jenkins插件中的Connect with ssh方法启动Docker容器并使用{{3}}

  5. Jenkins正在使用Docker容器中的root用户(至少/home/jenkins/...中的所有文件都是以root身份创建的

  6. 当我们将sleep步骤添加到管道中并docker exec...添加到正在运行的容器中时,如果我们尝试使用{{{}运行它,我们就无法以root身份执行简单的shell脚本1}}(即使我们之前使用./script.sh设置了正确的文件模式) - 我们也得到chmod +x script.sh。但是,如果我们使用sh: 1: permission denied

  7. ,我们就可以运行该脚本
  8. Docker容器中的sh script.sh用户有root - 而Jenkins正尝试使用bash运行脚本。

  9. 无论我们是否检查Docker插件模板配置中的sh标志,都会发生错误

  10. 我们已经尝试过的但是没有用的东西

    1. 将Docker容器中run privileged用户的登录shell更改为root

    2. /bin/sh步骤中提供shebang,àla

      sh '''#!/bin/sh
      echo "hello world"
      '''
      

    3. 在Jenkins全局配置中将shell执行程序设置为sh

    4. 更改ssh-slave Docker镜像的/bin/sh,使Dockerfile不运行ENTRYPOINT脚本,但运行bash at {0}}结束

    5. 感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

问题是容器中/home/jenkinsnoexec挂载:

$ mount
/dev/mapper/rhel-var on /home/jenkins type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)

基本问题是底层主机上的/var是使用noexec挂载的(/var是所有容器文件所在的位置...):

$ mount
/dev/mapper/rhel-var on /var type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)

因此,解决此问题的方法是通过

/var挂载到主机上
sudo mount -o remount,exec /var

为我们解决了这个问题。