用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' } } } }