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

Mic*_*ihs 8 shell groovy jenkins docker jenkins-pipeline

我在运行简单方面遇到了麻烦Jenkinsfile- 例如

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

主服务器上Jenkins的日志文件显示容器已成功启动,但构建作业因类似消息而崩溃

sh: 1: /home/jenkins/workspace/pipeline@tmp/durable-34c21b81/script.sh: Permission denied
Run Code Online (Sandbox Code Playgroud)

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

  1. 我们正在使用RHEL在VM上运行代理

  2. 我们使用Jenkins 的Docker插件在单独的Jenkins代理上启动/管理容器

  3. 我们使用Connect with sshJenkins插件中的方法旋转Docker容器并使用jenkinsci/ssh-slave Docker镜像

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

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

  6. rootDocker容器中的用户有一个bash- 而Jenkins正在尝试运行脚本sh.

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

我们已经尝试过但没有奏效的事情

  1. rootDocker容器中用户的登录shell更改为/bin/sh

  2. sh步骤中提供一个shebang ,àla

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

  3. 将shell执行程序设置为/bin/shJenkins全局配置

  4. 改变Dockerfile这样的ssh的-从码头工人形象ENTRYPOINT不运行bash脚本,但运行/bin/sh在年底

任何帮助表示赞赏!

Mic*_*ihs 2

问题是/home/jenkins容器中安装有noexec

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

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

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

/var所以这个问题的解决方案是通过以下方式在主机上挂载为可执行文件

sudo mount -o remount,exec /var
Run Code Online (Sandbox Code Playgroud)

这为我们解决了这个问题。

  • 我在运行 Jenkins 作业的计算机上执行了此挂载命令。不,我不必修改 Jenkinsfile 中的任何内容。Jenkinsfile 中的“sh”步骤生成一个小 shell 脚本,该脚本被复制到作业工作区中的某个临时文件夹中。在大多数情况下,这是“/var”中的某个目录。在此目录中,当运行“sh”步骤时,将执行此 shell 脚本。由于“/var”被挂载为“noexec”,这是不可能的,因此该步骤失败。希望这能让事情变得更清楚。 (2认同)