【发布时间】:2019-07-02 12:47:13
【问题描述】:
你好 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 不允许以超级用户权限运行。
我尝试通过创建自己的 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
【问题讨论】:
-
为什么不尝试在 docker 中使用 root 用户而不是创建不同的用户?
-
默认以root身份运行。但是如上所述,出于安全原因,Postgres 不允许以超级用户权限运行。嵌入式 postgres 在测试开始时自行安装,但如果在 root 下运行则无法安装。我需要一个没有 root 权限的用户
-
同时是否有自动创建的poatgres用户?
-
实际上我不确定,但我想有... postgresql-embedded 通过 java(在服务器启动时)(github.com/yandex-qatools/postgresql-embedded)和内部处理 postgres 服务的安装我自己的java代码,连接发生并且一切都设置好了
-
但是你为什么要以 root 用户身份运行管道?理想情况下,它不应该以 jenkins 用户身份运行,然后您可以以 jenkins 用户身份运行 docker 映像,而不是创建其他用户,以便管道和容器具有相同的所有者:jenkins?
标签: postgresql docker jenkins jenkins-pipeline root