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

我运行一个简单的Jenkinsfile有困难 – 例如

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

主人Jenkins的日志文件显示容器已成功启动,但构build作业崩溃,并显示一条消息

 sh: 1: /home/jenkins/workspace/pipeline@tmp/durable-34c21b81/script.sh: Permission denied 

这里是我们configuration/计算出来的一些额外的东西:

  1. 我们正在使用RHEL的虚拟机上运行代理

  2. 我们使用Jenkins的Docker Plugin来启动/pipe理单独的Jenkins代理上的容器

  3. 我们在Jenkins插件中使用Connect with ssh方法启动Docker容器,并使用jenkinsci / ssh-slave Docker镜像

  4. Jenkins在Docker容器中使用root用户(至less/home/jenkins/...所有文件都是以root身份创build的

  5. 当我们在pipe道和docker exec...添加一个sleep步骤到正在运行的容器时,如果我们试图用./script.sh来运行它(即使我们设置了正确的文件模式与之前的chmod +x script.sh ) – 我们也得到sh: 1: permission denied 。 但是我们可以运行脚本,如果我们使用sh script.sh

  6. Docker容器中的root用户有一个bash ,而Jenkins正试图用sh运行脚本。

  7. 无论是否检查Docker插件的模板configuration中的run privileged标志,都会发生错误

我们已经尝试过,但没有奏效

  1. 将Docker容器中的root用户的loginshell更改为/bin/sh

  2. 在步骤中提供一个shebang

     sh'''#!/ bin / sh
    回声“你好世界”
     “””
    

  3. 在Jenkins全局configuration中将shell执行器设置为/bin/sh

  4. 更改ssh-slave Docker镜像的ENTRYPOINT ,使ENTRYPOINT不运行bash脚本,但在最后运行/bin/sh

任何帮助表示赞赏!

问题是容器中的/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) 

所以这个问题的解决scheme是通过在主机上挂载/var来执行

 sudo mount -o remount,exec /var 

为我们解决了这个问题。