我无法运行简单的Jenkinsfile
- 例如
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
我们正在使用Jenkins的jenkinsci/ssh-slave Docker image在单独的Jenkins代理上启动/管理容器
我们使用Jenkins插件中的Connect with ssh
方法启动Docker容器并使用{{3}}
Jenkins正在使用Docker容器中的root
用户(至少/home/jenkins/...
中的所有文件都是以root身份创建的
当我们将sleep
步骤添加到管道中并docker exec...
添加到正在运行的容器中时,如果我们尝试使用{{{}运行它,我们就无法以root身份执行简单的shell脚本1}}(即使我们之前使用./script.sh
设置了正确的文件模式) - 我们也得到chmod +x script.sh
。但是,如果我们使用sh: 1: permission denied
Docker容器中的sh script.sh
用户有root
- 而Jenkins正尝试使用bash
运行脚本。
无论我们是否检查Docker插件模板配置中的sh
标志,都会发生错误
我们已经尝试过的但是没有用的东西
将Docker容器中run privileged
用户的登录shell更改为root
在/bin/sh
步骤中提供shebang,àla
sh '''#!/bin/sh echo "hello world" '''
在Jenkins全局配置中将shell执行程序设置为sh
更改ssh-slave Docker镜像的/bin/sh
,使Dockerfile
不运行ENTRYPOINT
脚本,但运行bash
at {0}}结束
感谢任何帮助!
答案 0 :(得分:1)
问题是容器中/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)
因此,解决此问题的方法是通过
将/var
挂载到主机上
sudo mount -o remount,exec /var
为我们解决了这个问题。