Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins管道与docker:以特定用户身份运行docker(嵌入式postgresql_Postgresql_Docker_Jenkins_Jenkins Pipeline_Root - Fatal编程技术网

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

Jenkins管道与docker:以特定用户身份运行docker(嵌入式postgresql,postgresql,docker,jenkins,jenkins-pipeline,root,Postgresql,Docker,Jenkins,Jenkins Pipeline,Root,嗨,堆栈溢出社区 我有一个maven-java项目,需要使用jenkins管道进行构建。 为此,我使用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.PostgresProc

嗨,堆栈溢出社区

我有一个maven-java项目,需要使用jenkins管道进行构建。 为此,我使用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映像,并将以下内容添加到DockerFile中:

RUN useradd myuser
USER myuser
当我从服务器的终端启动docker映像时,这就起作用了。但是通过使用jenkins管道,whoami仍然打印“root”,这表明jenkins管道在方案后面使用
run-u
,这将否决docker文件

我的管道作业目前如下所示:

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日志文件(希望这是唯一的问题)。用户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

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

sh 'sudo -u <youruser> mvn <clean or whatever> -f <path/to/pomfile.xml>'
sh'sudo-u mvn-f'
用户必须在Dockerfile中创建。我创建它时没有密码,但我认为这不重要,因为您是root

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

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

@Thomas Stubbe

我得到的错误与您上面提到的几乎相同。我还有一个带有postgresql的图像。在Dockerfile上,我创建了一个名为like tdv的用户,并在容器上使用id命令检查tdv权限为1000:1000。我可以通过Jenkins管道启动容器,但它无法执行sh命令,甚至我为每个c添加了sudo-u tdvOmand.你做过其他配置吗

我的Jenkins Pilleline脚本如下:

pipeline{
    agent none
  stages{
    stage('did operation inside container'){
     agent {
        docker{
        image 'tdv/tdv-test:8.2'
        label 'docker_machine'
        customWorkspace "/opt/test"
        registryUrl 'https://xxxx.xxxx.com'
        registryCredentialsId '8269c5cd-321e-4fab-919e-9ddc12b557f3'
        args '-u tdv --name tdv-test -w /opt/test -v /opt/test:/opt/test:rw,z -v /opt/test@tmp:/opt/test@tmp:rw,z -p 9400:9400 -p 9401:9401 -p 9402:9402 -p 9403:9403 -p 9407:9407 -p 9303:9303 --cpus=2.000 -m=4g xxx.xxx.com/tdv/tdv-test:8.2 tdv.server'
      }
    }
       steps{

               sh 'sudo tdv whoami'
               sh 'sudo tdv pwd'
               sh 'sudo tdv echo aaa'

       }

  }
    }
}

在作业运行之后,我可以检查容器的启动情况,但它仍然会出现如下错误

$ docker top f1140072d77c5bed3ce43a5ad2ab3c4be24e8c32cf095e83c3fd01a883e67c4e -eo pid,comm
ERROR: The container started but didn't run the expected command. Please double check your ENTRYPOINT does execute the command passed as docker run argument, as required by official docker images (see https://github.com/docker-library/official-images#consistency for entrypoint consistency requirements).
Alternatively you can force image entrypoint to be disabled by adding option `--entrypoint=''`.
[Pipeline] {
[Pipeline] sh
sh: /opt/test@tmp/durable-081990da/jenkins-log.txt: Permission denied
sh: /opt/test@tmp/durable-081990da/jenkins-result.txt.tmp: Permission denied
touch: cannot touch ‘/opt/test@tmp/durable-081990da/jenkins-log.txt’: Permission denied
mv: cannot stat ‘/opt/test@tmp/durable-081990da/jenkins-result.txt.tmp’: No such file or directory
touch: cannot touch ‘/opt/test@tmp/durable-081990da/jenkins-log.txt’: Permission denied
touch: cannot touch ‘/opt/test@tmp/durable-081990da/jenkins-log.txt’: Permission denied
解决方案 您目前有
sh'sudo tdv whoami'

我认为你应该在sudo之后添加
-u
标志,如下所示:
sh'sudo-u tdv whoami'

为什么不在docker中尝试用户root而不是创建不同的用户?默认情况下,它以root用户身份运行。但是如上所述,出于安全原因,Postgres不允许以超级用户权限运行。嵌入式Postgres在测试开始时自行安装,但如果在根目录下运行。我需要一个没有根权限的用户同时是否有自动创建的poatgres用户?我不确定,但我想有…postgresql embedded通过java(在服务器启动时)处理postgres服务的安装(),在我自己的java代码中,发生了一个连接,一切都设置好了,但为什么您要以root用户的身份运行管道?理想情况下,它不应该以jenkins用户的身份运行,然后您可以以jenkins用户的身份运行docker image,而不是创建其他用户,以便管道和容器都有相同的所有者:jenkins?