用sudo运行jenkinspipe道代理

我有一个在Docker容器中运行的Jenkins服务器,可以访问主机系统的docker,到目前为止它运行良好。 现在我想build立一个testingDocker容器内的脚本的stream水线。

Jenkinsfile:

pipeline { agent { docker 'nginx:1.11' } stages { stage('build') { steps { sh 'nginx -t' } } } } 

错误信息:

 > + docker pull nginx:1.11 > > Warning: failed to get default registry endpoint from daemon (Got > permission denied while trying to connect to the Docker daemon socket > at unix:///var/run/docker.sock: Get > http://%2Fvar%2Frun%2Fdocker.sock/v1.29/info: dial unix > /var/run/docker.sock: connect: permission denied). Using system > default: https://index.docker.io/v1/ > > Got permission denied while trying to connect to the Docker daemon > socket at unix:///var/run/docker.sock: Post > http://%2Fvar%2Frun%2Fdocker.sock/v1.29/images/create?fromImage=nginx&tag=1.11: > dial unix /var/run/docker.sock: connect: permission denied > > script returned exit code 1 

我的问题是,jenkins需要使用sudo运行docker命令,但是如何使用sudo来运行命令?

我面临同样的问题。 在分析控制台日志之后,我发现原因是Docker Jenkins插件启动了一个新的容器,其中包含特定选项-u 107:112

 ... docker run -t -d -u 107:112 ... ... 

尝试了很多选项后,例如:将jenkins添加到sudo组中(因为jenkins用户不存在于容器中,所以jenkins ),将USER root添加到Dockerfile ,但是没有一个能够做到这一点。

最后,我find了一个在docker agent中使用args覆盖-u选项的解决scheme。 这是我的Jenkinsfile

 pipeline { agent { docker { image 'ubuntu' args '-u root:sudo -v $HOME/workspace/myproject:/myproject' } } stages { stage("setup_env") { steps { sh 'apt-get update -y' sh 'apt-get install -y git build-essential gcc cmake make' } } stage("install_dependencies") { steps { sh 'apt-get install -y libxml2-dev' } } stage("compile_dpi") { steps { sh 'cd /myproject && make clean && make -j4' } } stage("install_dpi") { steps { sh 'cd /myproject && make install' } } stage("test") { steps { sh 'do some test here' } } } post { success { echo 'Do something when it is successful' bitbucketStatusNotify(buildState: 'SUCCESSFUL') } failure { echo 'Do something when it is failed' bitbucketStatusNotify(buildState: 'FAILED') } } } 

这里可能有一个安全问题,但这不是我的问题。

我刚刚有同样的确切问题。 您需要将jenkins用户添加到docker组中:

 DOCKER_SOCKET=/var/run/docker.sock DOCKER_GROUP=docker JENKINS_USER=jenkins if [ -S ${DOCKER_SOCKET} ]; then DOCKER_GID=$(stat -c '%g' ${DOCKER_SOCKET}) sudo groupadd -for -g ${DOCKER_GID} ${DOCKER_GROUP} sudo usermod -aG ${DOCKER_GROUP} ${JENKINS_USER} fi # Start Jenkins service sudo service jenkins restart 

在运行上述之后,pipe道成功启动docker

同样的问题在这里。

 [...] agent { docker 'whatever_I_try_doesnt_work'} # sudo, jenkins user in dockerroot group etc [...] 

所以我的解决方法是将其作为stream水线构build阶段中的一个步骤添加,如下所示:

 pipeline { agent any stages { stage('Build') { steps { sh 'sudo docker pull python:3.5.1' } } } }