Jenkins使用docker的管道:以特定用户身份运行docker(嵌入式postgresql

托马斯·斯图伯(Thomas Stubbe)

嗨,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
托马斯·斯图伯(Thomas Stubbe)

我已经解决了我们的问题。我所做的是sudomvn指挥之前请记住,每个sh步骤都有自己的外壳程序,因此您需要sudo在每个sh步骤中执行以下操作:

sh 'sudo -u <youruser> mvn <clean or whatever> -f <path/to/pomfile.xml>'

用户必须在Dockerfile中创建。我创建时没有密码,但是由于您是root用户,所以我认为这无关紧要。

您必须使用sudo而不是切换用户或其他方式,因为否则需要提供密码。

这绝不是一种干净的方法……我建议不要搞乱用户切换,除非您确实需要(例如运行嵌入式postgres)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Jenkins声明式管道运行特权Docker容器

在Docker上使用嵌入式Jetty服务器运行Java应用程序

从主机查询Docker嵌入式DNS

以非root用户身份运行docker或以root用户身份在tomcat上运行jenkins

Jenkins声明式管道Docker注册中心

Nginx Plus无法使用Docker嵌入式DNS服务器解析服务

嵌入式系统上的Docker,为什么不呢?

默认桥接网络上的docker嵌入式dns

嵌入式模型Docker映像的Acumos市场下载

Jenkins管道Docker-容器未运行

如何在独立的Jenkins中使用docker命令运行jenkins管道作业

在Docker容器中以主机用户身份运行

在Docker容器中以主机用户身份运行

使用Hudson的管道插件在嵌入式管道脚本中获取当前时间戳

如何使用Jenkins管道发布Docker映像

如何基于Jenkins声明式管道中的参数使用不同的私有docker代理?

Shopify嵌入式应用程序对我的Postgresql数据库的身份验证请求

docker jenkins dsl管道

Django中的嵌入式身份验证+ LDAP用户验证。如何?

SCM的Docker / Dockerfile代理的Jenkins声明式管道

免费的嵌入式令牌应用是特定的还是特定于用户的?

在开发环境中以非root用户身份运行docker的特定过程

返回特定的mongodb嵌入式文档

在docker映像内运行的jenkins管道刚刚挂起

以非root用户身份运行docker作为root用户

DocuSign嵌入式签名的隐式身份验证

在docusign中使用jwt身份验证进行嵌入式签名

Nginx没有从Docker 1.10.1中的嵌入式DNS获取主机

Jenkins管道docker代理-docker运行错误-无法运行映像-java.io.IOException