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

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

узел {
    stage ('Build') {
      docker.image ('maven: 3.3.3'). inside {
        sh 'mvn --version'
      }
    }
}

Но это не удается с ошибкой ниже.

enter image description here

Ponsuyambu

Ответы (33)

пользователя jenkins нужно добавить в группу docker:

sudo usermod -a -G docker jenkins

Затем перезапустите Jenkins.

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

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

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

sudo usermod -a -G docker [user]

Введите ваше имя пользователя, где [пользователь] - это.

Вы можете проверить его успешность, выполнив grep docker / etc / group и увидев что-то вроде этого:

docker:x:998:[user]

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

Затем измените идентификатор группы пользователей на docker:

newgrp docker

Наконец, выйдите из системы и войдите снова

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"

Я использую официальный образ докера jenkins (https://hub.docker.com/r/jenkins/jenkins), но я думаю, что это решение применимо для большинства случаев использования, когда мы хотим запускать Docker внутри контейнера Docker .

Рекомендуемый способ использования Docker внутри контейнера Docker - использовать демонстрационный модуль Docker хост-системы. Хорошая статья по этому поводу: https://itnext.io/docker-in-docker-521958d34efd.

Секрет решения проблемы с разрешениями, о которой идет речь в этом вопросе, состоит в том, чтобы добавить разрешения для пользователя контейнера внутри контейнера, а не для хост-системы. Только пользователь root имеет права на это по умолчанию, поэтому

docker exec -it -u root  bash
usermod -a -G docker 

сделает это. Не забудьте перезапустить контейнер.

Думаю, самый простой способ добиться этого - создать собственный Dockerfile:

# Official jenkins image
FROM jenkins/jenkins:lts
# Swith to root to be able to install Docker and modify permissions
USER root
RUN apt-get update
# Install docker
RUN curl -sSL https://get.docker.com/ | sh
# Add jenkins user to docker group
RUN usermod -a -G docker jenkins
# Switch back to default user
USER jenkins

# Bild the image:
# sudo docker build -t yourusername/imagename .
# Run the image and mount with the followin bind mount option:
# sudo docker run --name imagename -d -p8080:8080 -v /var/run/docker.sock:/var/run/docker.sock yourusername/imagename

Если вы запускаете Jenkins внутри контейнера докеров, и ваш Jenkins подключается к докеру хоста, вы можете исправить это только с помощью файла Dockerfile ниже:

FROM jenkins/jenkins:2.179
USER root
RUN groupadd docker && usermod -a -G docker jenkins
USER jenkins 

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

Если вы хотите, чтобы это было просто, используйте fixdockergid в своем Dockerfile.

Шаг 1: добавьте свое имя пользователя в группу docker:

sudo usermod -a -G docker $USER

Затем выйдите из системы и войдите снова.

Шаг 2: Затем измените идентификатор группы докеров:

newgrp docker

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

sudo usermod -a -G docker $USER
reboot

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

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

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

chmod 777 /var/run/docker.sock

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

2018-08-19

• 100001 100002 *

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

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

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

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

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

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

sudo usermod -a -G docker jenkins

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

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

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

  • У Агента (вероятно) не будут установлены программы Docker.
  • Агент не будет иметь доступа к сокету демона Docker и поэтому попытается запустить Docker-in-Docker, что не рекомендуется.
  • Jenkins дает числовой идентификатор пользователя и числовой идентификатор группы, которые должен использовать агент. У агента не будет дополнительных групп, потому что 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

As has been said before, fixing the second problem means running the Jenkins Docker container so it shares the Docker daemon socket with the Docker daemon that is outside the container. So you need to tell Jenkins to run the Docker container with that sharing, thus:

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

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

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

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

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

К счастью, Дженкинс запускает команду 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

2019-02-16

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

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

sudo usermod -a -G docker jenkins

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

docker exec -t -i my_container_id_or_name /bin/bash

)

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

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

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

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

# 1) Уважайте частную жизнь других людей.
# 2) Подумайте, прежде чем печатать.
№3) С большой силой приходит большая ответственность.

[sudo] пароль для jenkins:

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

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

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

After that, I started the jenkins job and it finished with success.

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

Если вы можете получить такие ошибки, как показано ниже,

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

или

level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix /var/run/docker.sock: connect: permission denied"

Просто попробуйте выполнить следующие команды,

$ sudo su - jenkins
$ sudo usermod -a -G docker $USER
$ sudo chown jenkins:docker /var/run/docker.sock

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

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

ubuntu@node1:~$ 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:

ubuntu@ip-172-31-21-106:/var/run$ ls -lrth docker.sock
srw-rw---- 1 root root 0 Oct 17 11:08 docker.sock
ubuntu@ip-172-31-21-106:/var/run$ sudo chmod 666 /var/run/docker.sock
ubuntu@ip-172-31-21-106:/var/run$ ls -lrth docker.sock
srw-rw-rw- 1 root root 0 Oct 17 11:08 docker.sock

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

ubuntu@ip-172-31-21-106:/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/
sudo usermod -a -G docker jenkins
sudo service jenkins restart

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

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

используйте ниже dockerfile

FROM jenkins/jenkins

USER root

# Install Docker
RUN apt-get update && \
    apt-get -y install apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common && \
    curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
    add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
    $(lsb_release -cs) \
    stable" && \
    apt-get update && \
    apt-get -y install docker-ce


# Compose
RUN curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose



RUN usermod -aG docker jenkins
RUN usermod -aG root jenkins

USER jenkins

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

в моем случае это просто запускалась служба докеров:

sudo service docker start

В моем случае это сработает успешно. перейдите в локальное репо и введите эту команду.

sudo chmod 666 /var/run/docker.sock

Если кто-то все еще сталкивается с проблемой на своем локальном компьютере (Ubuntu), попробуйте следующую команду:

sudo chmod 666 /var/run/docker.sock

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

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

Это работает для меня в Ubuntu 20.04

sudo chmod 666 /var/run/docker.sock

Не знаю, что именно он делает, но решает проблему.

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

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

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

Изменить разрешение доступа к файлу docker.sock

chmod 777 /var/run/docker.sock

или u может использовать sudo в начале команды.

chmod 777 разрешит все действия для всех пользователей, а chmod 666 разрешит всем пользователям читать и писать, но не может выполнить файл.

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

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

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

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

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

Метод 01: - Более безопасный метод

sudo usermod -aG docker ${USER}

Чтобы применить новое членство в группе, выйдите из сервера и снова войдите или введите следующее:

su - ${USER}

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

id -nG

Метод 02: - Не рекомендуется для общедоступных развертываний (небезопасно)

chmod 777 /var/run/docker.sock

Я запускаю Jenkins внутри контейнера докеров. Самым простым решением для меня было создание собственного изображения, которое динамически устанавливает 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

sudo setfacl --modify user: (имя пользователя или идентификатор): rw /var/run/docker.sock

Несколько раз пытался выполнить команду

sudo chmod 777 /var/run/docker.sock

но, к сожалению, мне приходится делать это каждый раз, когда я вхожу в систему ubuntu. Он не требует перезагрузки и более безопасен, чем usermod или chown. ID пользователя требуется, если имя пользователя существует только внутри контейнера, но не на хосте.

Надеюсь, что поможет решить проблему.

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

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

1) Внутри Docker-контейнера Jenkins (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 означает - чтение и запись (но не выполнение) для владельца и пользователей из группы.

Мне также удалось выполнить эту работу без изменения разрешений на локальном сокете unix /var/run/docker.sock. Что мне нужно было сделать, так это включить TCP-соединения на узле агента сборки, а затем указать хост докера в конфигурации облака Jenkins.

Предполагая, что вы используете образ aws, подключите ssh к узлам агента сборки и включите порты tcp с помощью файла / etc / sysconfig / docker

Добавьте параметр -H tcp: //0.0.0.0: 2376.

# Additional startup options for the Docker daemon, for example:
# OPTIONS="--ip-forward=true --iptables=true"
# By default we limit the number of open files per container
OPTIONS="-H tcp://0.0.0.0:2376 --default-ulimit nofile=1024:4096"

Обязательно перезапустите демон, используя sudo service docker restart

Наконец, вам нужно указать Jenkins использовать tcp по умолчанию, используя переменную среды DOCKER_HOST, настроенную в конфигурации облачных узлов. Обратите внимание, что это не конфигурация в среде конвейера Jenkins.

Перейдите в Jenkins -> Manage Jenkins -> Manage Cloud And Nodes -> Some Configuration -> Свойства узла -> Переменные среды

Затем добавьте свою переменную окружения DOCKER_HOST. enter image description here

ПРИМЕЧАНИЕ: Я использую для этого запуск агентов через ssh.

проверьте, работает ли ваш докер Докер состояния sudo systemctl

Проверить ошибку докер ps -a

Разрешить sudo usermod -aG docker $ {ПОЛЬЗОВАТЕЛЬ} следующая команда su - {USER}

долларов США

проверьте еще раз, не выдает ли ошибку докер ps -a

Я столкнулся с аналогичной проблемой, которая связана с проблемой разрешения , и причина этой проблемы в том, что демон / сервер Docker всегда запускается как пользователь root и хочет, чтобы вы всегда начинайте команду docker с sudo.

Демон Docker привязывается к сокету Unix вместо TCP-порта. По умолчанию этот сокет Unix принадлежит пользователю root, и другие пользователи могут получить к нему доступ только с помощью sudo.

Чтобы исправить это, вот что у меня сработало:

Сначала проверьте, есть ли у вас уже созданная группа докеров:

cat /etc/group

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

sudo groupadd docker

Затем подтвердите пользователя и свою группу, используя команду ниже:

cat /etc/group

Прокрутите, чтобы увидеть группу для докеров. Он должен быть в таком формате

docker:x:140:promisepreston

, где docker - это моя группа и Promisepreston - мой пользователь

Теперь мы можем добавить вашего пользователя в группу докеров

Также добавьте своего пользователя в группу «docker». Если вы хотите использовать Docker как пользователь без полномочий root:

Скопируйте и запустите приведенную ниже команду в своем терминале точно так, как она заявлена, не изменяя ее каким-либо образом, независимо от образа / контейнера / команды докера, который вы хотите запустить, или пытаетесь запустить, или вызывает проблему с разрешением:

sudo usermod -aG docker $USER

После выполнения приведенной выше команды вам нужно будет выйти из системы и снова войти в нее, чтобы ваше членство в группе было повторно оценено. Однако в Linux вы также можете запустить следующую команду, чтобы активировать изменения в группах (Скопируйте и запустите команду ниже в вашем терминале точно так, как она заявлена, без каких-либо изменений, независимо от образа докера / контейнер / команда, которую вы хотите запустить или пытаетесь запустить, или вызывает проблему с разрешением):

newgrp docker

ИЛИ

sudo systemctl restart docker

Теперь вы можете проверить, что вы можете запускать команды докеров без разрешений sudo, запустив команду, которая снова вызывает проблему с разрешениями, например (Замените my-command именем вашего изображения / контейнер / команда):

docker run my-command

Для файлов Docker и локальной файловой системы:

Если у вас есть копия файлов в вашей локальной файловой системе, вы можете изменить владельца каталога приложения, в котором хранятся файлы приложения, используя следующий формат:

sudo​​ ​ chown​​ ​ your_user:your_group​​ ​ -R​​ my-app-directory/

Так что в моем случае это будет:

sudo chown promisepreston:docker -R my-app-directory/

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

Вот и все.

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

2022 WebDevInsider