Получено разрешение на отказ при попытке подключиться к сокету демона Docker в unix:///var/run/docker.sock

Я новичок в докере. Я просто пытался использовать докер на своей локальной машине (Ubuntu 16.04) с Дженкинсом.

Я сконфигурировал новое задание с нижестоящим сценарием.

node {
    stage('Build') {
      docker.image('maven:3.3.3').inside {
        sh 'mvn --version'
      }
    }
}

Но с ошибкой ниже.

enter image description here

Ответ 1

Пользователь jenkins должен быть добавлен в групповой docker:

sudo usermod -a -G docker jenkins

Затем перезапустите Дженкинс.

редактировать

Если вы пришли к этому вопросу о переполнении стека, потому что получили это сообщение от docker, но не используете jenkins, скорее всего, ошибка та же: ваш непривилегированный пользователь не принадлежит к группе docker.

Ты можешь сделать:

sudo usermod -a -G docker alice

или как там ваше имя пользователя.

Вы можете проверить это в конце, выполнив команду cat/etc/group и увидеть что-то вроде этого:

docker:x:998:alice

в одной из строк.

Как говорит в комментарии Илья Колесников, relogin!

Ответ 2

Мои первые решения были:

usermod -aG docker jenkins
usermod -aG root jenkins
chmod 664 /var/run/docker.sock

Но никто из них не работает для меня, я пробовал:

chmod 777 /var/run/docker.sock

Это работает, но я не знаю, является ли он правильным.

Ответ 3

Успех для меня

sudo usermod -a -G docker $USER
reboot

Ответ 4

Я добавил пользователя jenkins в корневую группу и перезапустил jenkins, и он начал работать.

sudo usermod -a -G root jenkins
sudo service jenkins restart

Ответ 5

2018-08-19

Я застрял в течение нескольких дней на этом, и так как я не нашел полного ответа на вопрос "почему и как", я опубликую его для других людей, которые сталкиваются с той же проблемой, и ответы сверху не работают.

Вот три важных шага при запуске Jenkins в докере:

  1. Вы монтируете сокет /var/run/docker.sock в контейнер jenkins, чтобы иметь возможность использовать докер с хоста.
  2. Вы должны установить докер внутри контейнера, чтобы использовать его. Это отличная и простая статья о том, как это сделать. Обратите внимание, что в более новых версиях уже может быть установлен докер
  3. Вы запускаете sudo usermod -a -g docker jenkins, чтобы добавить jenkins в группу docker. Однако здесь вы можете столкнуться с проблемой прав доступа, если докер хоста и докер контейнера не имеют одинаковый идентификатор группы, поэтому очень важно настроить gid докера контейнера так, чтобы он совпадал с gid докера хоста.

Вы можете сделать это как часть сценария запуска или просто используя exec и выполнив это вручную: groupmod -g <YOUR_HOST_DOCKER_GID> docker.

Кроме того, не меняйте права доступа /var/run/docker.sock на 777 или что-то подобное, потому что это представляет /var/run/docker.sock угрозу безопасности.

Надеюсь это поможет

Ответ 6

У меня есть Jenkins, работающий в Docker, и подключенный Jenkins использует Docker-сокет от хост-машины Ubuntu 16.04 через том в /var/run/docker.sock.

Для меня решение было:

1) Внутри докер-контейнера Дженкинса (docker exec -it jenkins bash на главной машине)

usermod -a -G docker jenkins
chmod 664 /var/run/docker.sock
service jenkins restart (or systemctl restart jenkins.service)
su jenkins

2) На хост-машине:

sudo service docker restart

664 означает - чтение и запись (но не выполнение) для владельца и пользователей из группы.

Ответ 7

Просто добавив docker в качестве дополнительной группы для пользователя jenkins

sudo usermod -a -G docker jenkins

не всегда достаточно при использовании образа Docker в качестве агента Jenkins. То есть, если ваш Jenkinsfile начинается с pipeline{agent{dockerfile или pipeline{agent{image:

pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.jenkinsAgent'
        }
    }
    stages {

Это потому, что Дженкинс выполняет команду docker run, что приводит к трем проблемам.

  • На Агенте (вероятно) не будут установлены программы Docker.
  • Агент не будет иметь доступа к сокету демона Docker, поэтому попытается запустить Docker-in-Docker, что не рекомендуется.
  • Дженкинс дает числовой идентификатор пользователя и числовой идентификатор группы, которые должен использовать Агент. Агент не будет иметь никаких дополнительных групп, потому что при docker run не выполняется вход в контейнер (это больше похоже на sudo).

Установка Docker для Агента

Чтобы сделать Docker-программы доступными в образе Docker, просто нужно выполнить шаги установки Docker в вашем Dockerfile:

# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
 apt-get -y install \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg \
   lsb-release \
   software-properties-common

RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

RUN apt-get -y update && \
 apt-get -y install \
   docker-ce \
   docker-ce-cli \
   containerd.io

...

Совместное использование сокета Docker

Как было сказано ранее, для решения второй проблемы необходимо запустить контейнер Jenkins Docker, чтобы он разделял сокет демона Docker с демоном Docker, который находится вне контейнера. Таким образом, вы должны указать Jenkins запустить контейнер Docker с этим общим доступом:

pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.jenkinsAgent'
            args '-v /var/run/docker.sock:/var/run/docker.sock'
        }
    }

Установка UID и GID

Идеальным решением третьей проблемы было бы создание дополнительных групп для Агента. Это не представляется возможным. Единственное исправление, о котором я знаю, - это запуск Агента с UID Дженкинса и GID Docker (сокет имеет разрешение на групповую запись и принадлежит root.docker). Но в целом вы не знаете, что это за идентификаторы (они были выделены при useradd... jenkins и groupadd... docker когда на хосте были установлены Jenkins и Docker). И вы не можете просто сказать Дженкинс пользовательского пользователя jenkins и группа docker

args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'

потому что это говорит Docker использовать пользователя и группу с именами jenkins и docker в образе, и ваш образ Docker, вероятно, не имеет пользователя и группы jenkins, и даже если бы это было так, не было бы никакой гарантии, что у него будет такой же UID и GID в качестве хоста, и нет аналогичных гарантий, что GID docker одинаков

К счастью, Дженкинс запускает команду docker build для вашего Dockerfile в сценарии, поэтому вы можете использовать магию сценария оболочки для передачи этой информации в качестве аргументов сборки Docker:

pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile.jenkinsAgent'
            additionalBuildArgs  '--build-arg JENKINSUID='id -u jenkins' --build-arg JENKINSGID='id -g jenkins' --build-arg DOCKERGID='stat -c %g /var/run/docker.sock''
            args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'
        }
    }

Это использует команду id для получения UID и GID пользователя jenkins и команду stat для получения информации о сокете Docker.

Ваш Dockerfile может использовать эту информацию, чтобы настроить jenkins пользователя и docker группу для агента, используя groupadd, groupmod и useradd:

# Dockerfile.jenkinsAgent
FROM debian:stretch-backports
ARG JENKINSUID
ARG JENKINSGID
ARG DOCKERGID
...
# Install Docker in the image, which adds a docker group
RUN apt-get -y update && \
 apt-get -y install \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg \
   lsb-release \
   software-properties-common

RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
RUN add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

RUN apt-get -y update && \
 apt-get -y install \
   docker-ce \
   docker-ce-cli \
   containerd.io

...
# Setup users and groups
RUN groupadd -g ${JENKINSGID} jenkins
RUN groupmod -g ${DOCKERGID} docker
RUN useradd -c "Jenkins user" -g ${JENKINSGID} -G ${DOCKERGID} -M -N -u ${JENKINSUID} jenkins

Ответ 8

2019-02-16

Большинство шагов были для меня такими же, как и другие. Однако я не смог добавить Дженкинса в групповой докер, используя usermod с упомянутыми решениями.

Я попробовал следующую команду с хоста докера и из запущенного контейнера докера:

sudo usermod -a -G docker jenkins

(Я вошел в работающий докер-контейнер с помощью следующей команды с хоста докера:

docker exec -t -i my_container_id_or_name /bin/bash

)

Получено от хоста докера:

usermod: пользователь 'jenkins' не существует

Получено из докера контейнера:

Мы надеемся, что вы получили обычную лекцию от локального системного администратора. Обычно это сводится к этим трем вещам:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

[sudo] пароль для Дженкинса:

Я не знал пароль.

Без sudo части команды, в контейнере Docker я получил:

usermod: В доступе отказано. usermod: не может заблокировать /etc/passwd; Попробуйте позже.

Решение: я вошел в работающий контейнер докера с хоста докера с помощью следующей команды:

docker exec -t -i -u root my_container_id_or_name /bin/bash

Теперь я вошел в систему как root и выдал следующую команду:

usermod -a -G docker jenkins

Затем с хоста докера я перезапустил свой работающий контейнер докера с помощью следующей команды:

docker restart my_container_id_or_name

После этого я начал работу Дженкинса, и она закончилась с успехом.

Я использовал только пользователя root для выдачи команды usermod для пользователя jenkins.

Ответ 9

2019-05-26

Это сработало для меня!

Пример docker-compose:

version: "3"
services:
  jenkins:
    image: jenkinsci/blueocean
    privileged: true
    ports:
      - "8080:8080"
    volumes:
      - $HOME/learning/jenkins/jenkins_home:/var/jenkins_home
    environment:
      - DOCKER_HOST=tcp://socat:2375
    links:
      - socat

  socat:
     image: bpack/socat
     command: TCP4-LISTEN:2375,fork,reuseaddr UNIX-CONNECT:/var/run/docker.sock
     volumes:
        - /var/run/docker.sock:/var/run/docker.sock
     expose:
        - "2375"

Ответ 10

В моем случае это было необходимо не только добавить jenkins пользователя docker группы, но сделать что Группа основной группы jenkins пользователя.

# usermod -g docker jenkins
# usermod -a -G jenkins jenkins

Не забудьте снова подключить подчиненный узел jenkins или перезапустить сервер jenkins, в зависимости от вашего дела.

Ответ 11

sudo usermod -a -G docker jenkins
sudo service jenkins restart

Ответ 12

Проверьте это изображение докера, которое я сделал, чтобы использовать дженкинсов с докером. https://hub.docker.com/r/fristonio/jenkins_docker/

Прочтите инструкцию по использованию. Кроме того, вы можете посмотреть файл Docker здесь

Ответ 14

На сервере, где работает Jenkins, я использовал

sudo setfacl -m user:tomcat:rw /var/run/docker.sock

А затем запустите каждый док-контейнер с помощью

-v /var/run/docker.sock:/var/run/docker.sock

Использование setfacl кажется более подходящим вариантом, и не требуется "-u user". Затем контейнеры запускаются от имени того же пользователя, на котором работает Jenkins. Но я был бы признателен за любые отзывы экспертов по безопасности.

Ответ 15

Я запускаю Дженкинса внутри докера. Самым простым решением для меня было создать собственное изображение, которое динамически устанавливает GID, например:

FROM jenkins/jenkins:lts
...
CMD DOCKER_GID=$(stat -c '%g' /var/run/docker.sock) && \
    groupadd -for -g ${DOCKER_GID} docker && \
    usermod -aG docker jenkins && \
    sudo -E -H -u jenkins bash -c /usr/local/bin/jenkins.sh

см.: https://github.com/jenkinsci/docker/issues/263

В качестве альтернативы вы можете запустить jenkins со следующими параметрами:

-v /var/run/docker.sock:/var/run/docker.sock \
-u jenkins:$(getent group docker | cut -d: -f3)

Предполагается, что на вашем образе jenkins установлен клиент Docker. Видеть: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci

Ответ 16

При выполнении производственного конфигурирования я получил проблему с разрешением. Я попытался решить эту проблему ниже.

Сообщение об ошибке

[email protected]:~$ docker run hello-world
docker: 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.38/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

Решение: разрешения сокета, указанного в сообщении об ошибке, /var/run/docker.sock:

[email protected]:/var/run$ ls -lrth docker.sock
srw-rw---- 1 root root 0 Oct 17 11:08 docker.sock
[email protected]:/var/run$ sudo chmod 666 /var/run/docker.sock
[email protected]:/var/run$ ls -lrth docker.sock
srw-rw-rw- 1 root root 0 Oct 17 11:08 docker.sock

После изменения разрешения для docket.sock выполните приведенную ниже команду, чтобы проверить разрешения.

[email protected]:/var/run$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Ответ 17

Возможно, вам нужно запустить докер с опцией "-u root" с самого начала

По крайней мере, это решило мою проблему