Дженкинс агент AWS = ошибка только в задании php-проекта, задания Java-проектов работают нормально: /var/run/docker.sock: подключение: отказано в разрешении

#php #amazon-web-services #docker #jenkins #continuous-integration

Вопрос:

Как это исправить?

Вот в чем моя ошибка:

 Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http:///var/run/docker.sock/v1.40/auth: dial unix /var/run/docker.sock: connect: permission denied
 

!!! Эта ошибка только в задании php-проекта, задания Java-проектов работают нормально. !!!

Проверьте, пожалуйста, также используемую конфигурацию:

 dockerhub_private = '5555555555.dkr.ecr.eu-west-1.amazonaws.com'

pipeline {
    options {
        durabilityHint 'PERFORMANCE_OPTIMIZED'

        buildDiscarder logRotator(daysToKeepStr: '6', numToKeepStr: '30')
    }
    agent {
        label 'ec2spot-t3large-php74'
    }

    parameters {
        booleanParam(name: 'UPDATE_DOCKER_IMAGES', defaultValue: true, description: 'Update Docker images?')
    }

    stages {
        stage('Base Docker') {
            when {
                beforeAgent true
                anyOf {
                    expression { params.UPDATE_DOCKER_IMAGES }
                }
            }
            steps {
                script {
                    GIT_COMMIT = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()
                    GIT_BRANCH = sh(script: 'git rev-parse --abbrev-ref HEAD', returnStdout: true).trim()
                }

                sh "df -h"

                withAWS(credentials: 'JENKINS_AWS_ACCESS', region: 'eu-west-1') {
                    sh ecrLogin()
                }

                withCredentials([
                    usernamePassword(
                        credentialsId: 'DOCKERHUB_company_',
                        usernameVariable: 'DOCKER_USERNAME',
                        passwordVariable: 'DOCKER_PASSWORD'
                    )
                ]) {
                    sh "docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD"
                }

                pullFromPublicAndPushToPrivate([
                    'external/php'
                ], params.UPDATE_DOCKER_IMAGES)

                sh """
                    docker logout; \
                    df -h; \
                    docker info; \
                    top -b -n1 -o %MEM; \
                    docker images | grep company_r;
                  """
            }

             post {
                 unsuccessful {
                     slackSend tokenCredentialId: 'slack_y_core_team_token', color: 'danger',
                               teamDomain: 'company-it', channel: '#x_team_ci',
                               message: "DOCKER PULL FAILED: <${BUILD_URL}|${BUILD_ID}>, branch: ${env.GIT_BRANCH}"
                 }
             }
        }

        stage('Build') {
            steps {
                 githubNotify status: 'PENDING', description: "BUILD $BUILD_ID has started", context: 'jenkins/build',
                              targetUrl: "$BUILD_URL", credentialsId: 'company_msbot',
                              account: 'company', repo: 'y_php_project', sha: "${env.GIT_COMMIT}"
                sh """
                    echo RELEASE_VERSION=`date  "%Y%m%d"`-r$BUILD_NUMBER; \
                    echo REVISION=$RELEASE_VERSION; \
                    echo DOCKER_HOST=tcp://localhost:4243; \
                    echo $REVISION>$WORKSPACE/nginx/version.html; \
                    echo IMAGE_NAME=company_r/cx-y_php_project; \

                    cd $WORKSPACE; \
                    docker build -t $IMAGE_NAME:$REVISION .; \

                    docker push $IMAGE_NAME:$REVISION; \
                    docker tag  $IMAGE_NAME:$REVISION $IMAGE_NAME:latest; \
                    docker push $IMAGE_NAME:latest; \

                    PUSH_RETRY_COUNT=15; \
                    PUSH_RETRY_DELAY=30; \
                    retry "docker push $IMAGE_NAME:latest" $PUSH_RETRY_COUNT $PUSH_RETRY_DELAY; \
                    docker tag  $IMAGE_NAME:latest $IMAGE_NAME:$REVISION; \
                    retry "docker push $IMAGE_NAME:$REVISION" $PUSH_RETRY_COUNT $PUSH_RETRY_DELAY; \
                    #remove old images; \
                    set  e; \
                    docker images | grep "^<none>" | awk '{system("docker rmi -f "$3)}'; \
                    docker images | grep $IMAGE_NAME | grep -v "minute" | grep -v "second" | awk '{system("docker rmi -f "$3)}'; \
                    set -e; \
                """
                sh script: 'sar -A', label: 'System Stats'
            }

            post {
                success {
                    githubNotify status: 'SUCCESS', description: "BUILD $BUILD_ID has finished", context: 'jenkins/build',
                                 targetUrl: "$BUILD_URL", credentialsId: 'company_msbot',
                                 account: 'company', repo: 'y_php_project', sha: "${env.GIT_COMMIT}"
                    slackSend tokenCredentialId: 'slack_y_core_team_token',
                            teamDomain: 'company-it', channel: '#x_team_ci',
                            message: "BUILD SUCCED: <${BUILD_URL}|${BUILD_ID}>, branch: ${env.GIT_BRANCH}"
                }

                unsuccessful {
                    githubNotify status: 'ERROR', description: "BUILD $BUILD_ID has failed", context: 'jenkins/build',
                                 targetUrl: "$BUILD_URL", credentialsId: 'company_msbot',
                                 account: 'company', repo: 'y_php_project', sha: "${env.GIT_COMMIT}"

                    slackSend tokenCredentialId: 'slack_y_core_team_token', color: 'danger',
                              teamDomain: 'company-it', channel: '#x_team_ci',
                              message: "BUILD FAILED: <${BUILD_URL}|${BUILD_ID}>, branch: ${env.GIT_BRANCH}"
                }
            }
        }
    }
}

def getNameInPrivate(image) {
    if (image.startsWith('company_r/')) {
        image
    } else {
        "external/${image.split('/')[-1]}"
    }
}

void pullFromPublicAndPushToPrivate(images, updateFromPublic) {
    for (image in images) {
        def private_image = getNameInPrivate(image)

        sh script: """
              docker pull ${dockerhub_private}/${private_image} amp;amp;
                docker tag ${dockerhub_private}/${private_image} ${image};
              ECR_PULL_CODE=$?;
              if [ "$ECR_PULL_CODE" != "0" ] || [ "${updateFromPublic}" = "true" ]
              then
                docker pull ${image}; \
                docker tag ${image} ${dockerhub_private}/${private_image}; \
                docker push ${dockerhub_private}/${private_image};
              fi
            """.stripIndent(), label: "Pull amp; Push ${image}"
    }
}
 

Я также предоставлю файл Dockerfile

 FROM php:7.2-fpm

COPY composer.lock composer.json /var/www/

WORKDIR /var/www

RUN apt-get update amp;amp; apt-get install -y 
    build-essential 
    mariadb-client 
    libpng-dev 
    libjpeg62-turbo-dev 
    libfreetype6-dev 
    locales 
    zip 
    jpegoptim optipng pngquant gifsicle 
    vim 
    unzip 
    git 
    curl

RUN apt-get clean amp;amp; rm -rf /var/lib/apt/lists/*

RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

COPY . /var/www

RUN composer install

COPY docker/start.sh /usr/local/bin/start
RUN chmod 777 /usr/local/bin/start

RUN chown www:www /var/www

RUN chown -R www:www-data storage
RUN chown -R www:www-data bootstrap/cache
RUN chmod -R 775 storage
RUN chmod -R 775 bootstrap/cache

USER www

EXPOSE 9000
CMD ["/usr/local/bin/start"]
 

О чем еще следует упомянуть?

Может быть, плагины? Но, похоже, проблема только в этой работе.

Или разорвать конфигурацию / версию.

Ответ №1:

Ошибка гласит, что ваш текущий пользователь не может получить доступ к ядру docker, поскольку у вас отсутствуют разрешения на доступ к сокету unix для связи с ядром.
Чтобы решить эту проблему : Выполните приведенную ниже команду в любой из ваших оболочек:
sudo usermod -a -G docker $USER
sudo usermod -a -G docker jenkins
ПРИМЕЧАНИЕ : выполните полную перезагрузку компьютера, а также Дженкинса.
После этого шага : Полностью выйдите из своей учетной записи и войдите обратно.

Для получения дополнительной информации : https://docs.docker.com/engine/install/linux-postinstall/

Комментарии:

1. нет( другие задания в порядке, поэтому отсутствие разрешений не является проблемой