【问题标题】:Jenkins docker permission詹金斯码头工人许可
【发布时间】: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


    【解决方案1】:

    找出用于运行jenkins 的用户并将该用户添加到docker 组。

    这应该解决权限问题。

    您可以使用sudo usermod -aG docker <jenkins-user-name> 将用户添加到 docker 组。

    为什么this is needed

    docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。经过 默认Unix socket归root用户所有,其他用户可以 只能使用 sudo 访问它。 docker 守护进程始终以 root 身份运行 用户。

    如果在使用 docker 命令时不想使用 sudo,请创建 一个名为 docker 的 Unix 组并向其添加用户。当 docker 守护进程 开始时,它使 Unix 套接字的所有权由 码头工人组。

    【讨论】:

    • 我必须在哪里运行它?在主机上?
    • 是的,在主机上运行它。请确保您替换了 jenkins 进程正在运行的正确用户
    • 如果您决定这样做,请确保您了解安全隐患:security.stackexchange.com/a/178886/20774
    • 我的主机中没有jenkins用户=/,问题是我在我的主机上运行jenkins,然后jenkins容器必须创建docker容器。在我的詹金斯容器中,我没有 docker 组(但我有一个 dockerhost)。我用 docker-compose.yml 编辑了我的帖子
    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2019-03-17
    • 2020-09-29
    • 2023-04-01
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多