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

前端之家收集整理的这篇文章主要介绍了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相关文章