gpt4 book ai didi

postgresql - Jenkins 管道与 docker : run docker as specific user (embedded postgresql

转载 作者:行者123 更新时间:2023-11-29 11:36:35 25 4
gpt4 key购买 nike

你好 Stack Overflow 社区!

我有一个需要使用 jenkins 管道构建的 maven - java 项目。为此,我使用 docker 镜像 maven:3.3.3 配置了作业。一切正常,除了我使用 ru.yandex.qatools.embed:postgresql-embedded。这在本地有效,但在 Jenkins 上它提示启动 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 不允许以 super 用户权限运行。

我尝试通过创建我自己的 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 被添加到组 root,但这没有区别:

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

最佳答案

我已经解决了我们案例中的问题。我所做的是在 mvn 命令之前执行 sudo。请记住,每个 sh 步骤都有自己的 shell,因此您需要在每个 sh 步骤中执行 sudo:

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

用户必须在 Dockerfile 中创建。我在没有密码的情况下创建了它,但我认为这并不重要,因为你是 root...

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

这远不是一个干净的方法......我建议不要乱用用户切换,除非你真的需要(比如运行嵌入式 postgres)

关于postgresql - Jenkins 管道与 docker : run docker as specific user (embedded postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54589652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com