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/计算出来的一些额外的东西:
-
我们正在使用RHEL的虚拟机上运行代理
-
我们使用Jenkins的Docker Plugin来启动/pipe理单独的Jenkins代理上的容器
-
我们在Jenkins插件中使用
Connect with ssh
方法启动Docker容器,并使用jenkinsci / ssh-slave Docker镜像 -
Jenkins在Docker容器中使用
root
用户(至less/home/jenkins/...
所有文件都是以root身份创build的 -
当我们在pipe道和
docker exec...
添加一个sleep
步骤到正在运行的容器时,如果我们试图用./script.sh
来运行它(即使我们设置了正确的文件模式与之前的chmod +x script.sh
) – 我们也得到sh: 1: permission denied
。 但是我们可以运行脚本,如果我们使用sh script.sh
-
Docker容器中的
root
用户有一个bash
,而Jenkins正试图用sh
运行脚本。 -
无论是否检查Docker插件的模板configuration中的
run privileged
标志,都会发生错误
我们已经尝试过,但没有奏效
-
将Docker容器中的
root
用户的loginshell更改为/bin/sh
-
在步骤中提供一个shebang
sh'''#!/ bin / sh 回声“你好世界” “””
-
在Jenkins全局configuration中将shell执行器设置为
/bin/sh
-
更改ssh-slave Docker镜像的
ENTRYPOINT
,使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,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)
所以这个问题的解决scheme是通过在主机上挂载/var
来执行
sudo mount -o remount,exec /var
为我们解决了这个问题。