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

我无法运行简单的Jenkins文件 – 例如

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

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

>我们正在使用RHEL在VM上运行代理
>我们使用Docker Plugin for Jenkins在单独的Jenkins代理上启动/管理容器
>我们使用Jenkins插件中的Connect with ssh方法旋转Docker容器并使用jenkinsci/ssh-slave Docker image
> Jenkins在Docker容器中使用root用户(至少/ home / jenkins / …中的所有文件都是以root身份创建的
>当我们将一个睡眠步骤添加到管道和docker exec …进入正在运行的容器中时,如果我们尝试使用./script.sh运行它,我们就无法以root身份执行简单的shell脚本(即使我们设置正确文件模式与chmod x script.sh之前) – 我们也得到sh:1:权限被拒绝.但是如果我们使用sh script.sh,我们可以运行脚本
> Docker容器中的root用户一个bash – 而Jenkins正试图用sh运行脚本.
>无论我们是否检查Docker插件的模板配置中的run privileged标志,都会发生错误

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

>将Docker容器中root用户登录shell更改为/ bin / sh
>在sh步骤中提供一个shebang,àla

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

>在Jenkins全局配置中将shell执行程序设置为/ bin / sh
>更改ssh-slave Docker镜像的Dockerfile,使ENTRYPOINT不运行bash脚本,但最后运行/ bin / sh

任何帮助表示赞赏!

最佳答案
问题是容器中的/ home / jenkins是用noexec挂载的:

$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,noquota)

所以这个问题的解决方案是将/ var挂载到主机上

sudo mount -o remount,exec /var

解决了我们的问题.

相关文章

Docker是什么Docker是 Docker.Inc 公司开源的一个基于 LXC技...
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng...
镜像操作列出镜像:$ sudo docker imagesREPOSITORY TAG IMA...
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p...
在 Docker 中,如果你修改了一个容器的内容并希望将这些更改...
在Docker中,--privileged 参数给予容器内的进程几乎相同的权...