【发布时间】:2018-04-10 09:36:34
【问题描述】:
在 Ubuntu 服务器上,我正在运行 jenkins docker 容器。出于测试目的,在我的项目的 jenkinsfile 中,我必须运行一个 postgres 服务器。 我正在尝试在我的步骤中构建一个容器 postegres docker。
但是,我做不到,我得到权限错误:
在尝试连接到 unix:///var/run/docker.sock 的 Docker 守护进程套接字时获得权限被拒绝: 得到 http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/json?filters=%7B%22name%22%3A%7B%22vpx_postgres%22%3Atrue%7D%7D: 拨打 unix /var/run/docker.sock:连接:权限被拒绝
下面是我的 jenkins 文件。 “数据库创建”阶段失败了。
def message = "";
def author = "";
def getLastCommitMessage = {
message = sh(returnStdout: true, script: 'git log -1 --pretty=%B').trim()
}
def getGitAuthor = {
def commit = sh(returnStdout: true, script: 'git rev-parse HEAD')
author = sh(returnStdout: true, script: "git --no-pager show -s --format='%an' ${commit}").trim()
}
pipeline {
agent {
docker { image 'starefossen/ruby-node' }
}
stages {
stage('Database creation') {
steps {
sh 'docker ps -f name=project_postgres -q | xargs --no-run-if-empty docker container stop'
sh 'docker container ls -a -fname=project_postgres -q | xargs -r docker container rm'
sh 'docker pull postgres'
sh 'docker run --name project_postgres -e POSTGRES_PASSWORD=secret -e POSTGRES_USER=postgres -p 5432:5432 -d postgres'
}
}
stage('Test') {
steps {
script {
getLastCommitMessage()
getGitAuthor()
}
sh 'RAILS_ENV=test bundle install --jobs 3'
sh 'RAILS_ENV=test yarn install'
sh 'RAILS_ENV=test bundle exec rails db:migrate'
sh 'RAILS_ENV=test bundle exec rspec -f documentation'
}
}
}
post {
failure {
rocketSend channel: 'project-x-ci', emoji: ':x:', message: "Build failed - Commit : '${message}' by ${author}", rawMessage: true
}
}
}
也许问题出在 jenkins docker 上?这里是 docker-compose.yml :
version: '2'
services:
jenkins-server:
build: ./
ports:
- 8080:8080
- 50000:50000
volumes:
- /home/xero/jenkins/jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
environment:
JENKINS_USER: jenkins
JENKINS_URL: "http://10.0.1.66:8080/"
DOCKER_SOCKET: /var/run/docker.sock
DOCKER_GROUP: dockerhost
DOCKER_HOST: unix:///var/run/docker.sock
restart: always
dns:
- 10.0.1.1
Docker 文件:
FROM jenkinsci/jenkins:latest
USER root
COPY ["entrypoint.sh", "/"]
RUN apt-get update && \
apt-get install sudo && \
chmod 755 /entrypoint.sh
ENTRYPOINT ["/bin/bash","-c","./entrypoint.sh"]
还有我的 entrypoint.sh:
#!/bin/bash
if [ -S ${DOCKER_SOCKET} ]; then
DOCKER_GID=$(stat -c '%g' ${DOCKER_SOCKET})
groupadd -for -g ${DOCKER_GID} ${DOCKER_GROUP}
usermod -aG ${DOCKER_GROUP} ${JENKINS_USER}
fi
exec sudo -E -H -u jenkins bash -c /usr/local/bin/jenkins.sh
重要提示:
HOST(ubuntu) -> JENKINS(docker) -> POSTGRES(docker)
在我的jenkins docker容器中,docker是可用的,我没有问题。问题是当我从 jenkins 文件中构建 jenkins 项目时。
所以 JENKINS 容器,不能创建其他容器(这里是 POSTGRES 容器)
【问题讨论】:
标签: postgresql docker jenkins jenkins-pipeline