嗨,Stack Overflow社区!
我有一个maven-java项目,需要使用jenkins管道构建。为此,我已经使用docker image配置了作业maven:3.3.3
。一切正常,除了我使用的事实ru.yandex.qatools.embed:postgresql-embedded
。这在本地有效,但是在詹金斯上,它抱怨启动Postgres:
2019-02-08 09:31:20.366 WARN 140 --- [ost-startStop-1] r.y.q.embed.postgresql.PostgresProcess: Possibly failed to run initdb:
initdb: cannot be run as root
Please log in (using, e.g., "su") as the (unprivileged) user that will own the server process.
2019-02-08 09:31:40.999 ERROR 140 --- [ost-startStop-1] r.y.q.embed.postgresql.PostgresProcess: Failed to read PID file (File '/var/.../target/database/postmaster.pid' does not exist)
java.io.FileNotFoundException: File '/var/.../target/database/postmaster.pid' does not exist
显然,出于安全原因,Postgres不允许以超级用户权限运行。
我尝试通过创建自己的docker-image版本并将以下内容添加到DockerFile来以用户身份运行:
RUN useradd myuser
USER myuser
当我从服务器的终端启动docker映像时,此方法有效。但是通过使用jenkins管道,whoami仍会打印“ root”,这表明Jenkins管道run -u
在方案背后使用,这会否定DockerFile?
我的管道作业当前是如此简单:
pipeline {
agent {
docker {
image 'custom-maven:1'
}
}
stages {
stage('Checkout') {
...
}
stage('Build') {
steps {
sh 'whoami'
sh 'mvn clean install'
}
}
}
}
所以,我的问题是:如何以其他用户身份启动此docker映像?还是在运行之前切换用户mvn clean install
?
更新:
通过在jenkins管道中将-u myuser作为args添加,我确实以正确的用户身份登录,但是该作业无法访问jenkins-log文件(希望这是唯一的问题)。用户myuser已添加到组根目录,但这没有区别:
agent {
docker {
image 'custom-maven:1'
args '-u myuser'
}
}
错误:
sh: 1: cannot create /var/.../jenkins-log.txt: Permission denied
sh: 1: cannot create /var/.../jenkins-result.txt.tmp: Permission denied
mv: cannot stat ‘/var/.../jenkins-result.txt.tmp’: No such file or directory
touch: cannot touch ‘/var/.../jenkins-log.txt’: Permission denied
我已经解决了我们的问题。我所做的是sudo
在mvn
指挥之前。请记住,每个sh
步骤都有自己的外壳程序,因此您需要sudo
在每个sh
步骤中执行以下操作:
sh 'sudo -u <youruser> mvn <clean or whatever> -f <path/to/pomfile.xml>'
用户必须在Dockerfile中创建。我创建时没有密码,但是由于您是root用户,所以我认为这无关紧要。
您必须使用sudo
而不是切换用户或其他方式,因为否则需要提供密码。
这绝不是一种干净的方法……我建议不要搞乱用户切换,除非您确实需要(例如运行嵌入式postgres)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句