Docker : unix : ///var/run/docker.sock에서 Docker 데몬 소켓에 연결하는 동안 권한이 거부되었습니다.


175

도커를 처음 사용합니다. Jenkins와 함께 로컬 컴퓨터 (Ubuntu 16.04)에서 도커를 사용하려고했습니다.

아래 파이프 라인 스크립트로 새 작업을 구성했습니다.

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

그러나 아래 오류로 실패합니다.

여기에 이미지 설명을 입력하십시오


1
모 놀리 식 Jenkins입니까, 아니면 마스터-슬레이브 설정입니까? docker inspect 명령을 실행중인 사용자를 확인하십시오. /var/run/docker.sock에 그룹에 대한 RW 액세스 권한이 있는지 확인하십시오.
Ram Kamath


답변:


294

사용자 jenkins를 그룹에 추가해야합니다 docker.

sudo usermod -a -G docker jenkins

그런 다음 Jenkins를 다시 시작하십시오.

편집하다

docker 에서이 메시지를 수신했지만 jenkins를 사용하지 않기 때문에이 스택 오버플로에 도달하면 오류가 동일합니다. 권한이없는 사용자는 docker 그룹에 속하지 않습니다.

넌 할 수있어:

sudo usermod -a -G docker alice

또는 사용자 이름이 무엇이든.

마지막에 확인하고 grep docker /etc/group다음과 같은 것을 볼 수 있습니다 .

docker:x:998:alice

한 줄에.

그런 다음 사용자 그룹 ID를 다음으로 변경하십시오 docker.

newgrp docker

88
및 다시 로그인 사용자
Ilya Kolesnikov

8
좋은 대답이지만 더 일반적으로 우리는 이것을 할 수 있습니다 : sudo usermod -a -G docker $USER로그 아웃 또는 재부팅. 링크
Julien Nyambal

10
이것이 실제로 작동하려면 서버를 다시 시작해야했습니다.
etagwerker

3
이것이 작동하려면 노드를 분리 / 재 연결해야했습니다 (ssh를 통해 연결됨)
GaspardP

28
다시 로그인 할 필요가 없으며 newgrp docker동일한 터미널 세션에서 대신 사용하십시오 .
C14L

69

첫 번째 해결책은 다음과 같습니다.

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

그러나 그들 중 누구도 나를 위해 일하지 않습니다.

chmod 777 /var/run/docker.sock

그것은 효과가 있지만 그것이 올바른 전화인지는 모르겠습니다.


4
실패한 이유는 터미널을 다시 열어야하기 때문입니다. 664를 수행 한 후에 실패했지만 새로운 쉘을 열었습니다.
PHGamer

1
다시 열려고했지만 마지막 chmod 777 이후에 작동하기 시작했습니다.
ironic

문제는 재부팅 후 777이 660으로 재설정되었다는 것입니다. 문제를 해결 한 것은 'usermod -aG users jenkins'였습니다.
ironic

재설정되었지만 docker.sock 권한을 777로 설정하지 마십시오. 이는 시스템의 모든 사용자에게 루트를 제공합니다. 그들은 docker와 대화하고 제한없이 특권 컨테이너를 만들 수 있습니다.
랜스 허드슨

3
이것은 저자와 저에게도 효과가 있었지만 docker.sock파일에 대한 더 많은 액세스 권한을 부여 하는 것이 최선의 해결책은 아닙니다 usermod. 명령 만 실행 한 다음 시스템을 재부팅하면됩니다. 그렇지 않으면 적용되지 않습니다
Mariano Ruiz

32

나를위한 성공

sudo usermod -a -G docker $USER
reboot

4
재부팅 할 필요가 없습니다. 로그 아웃 한 후 다시 로그인하십시오. 나는 usermod에 대해 이야기하고있다
Abdennour TOUMI

1
우분투 18.04에서 설정이 작동하도록 재부팅해야했습니다.
Nikhil

1
우분투 20.04에서 재부팅이 필요했습니다. 세션을 종료하지 못했습니다.
framontb

또는 로그 아웃하는 대신 su $ {USER}를 실행하십시오.
goonerify

19

2018-08-19

나는 이것에 며칠 동안 붙어 있었고 그 이유와 방법에 대한 완전한 대답을 찾지 못했기 때문에 같은 문제에 걸려 넘어지는 다른 사람들을 위해 하나를 게시 할 것이며 위의 대답은 효과가 없습니다.

docker 내에서 Jenkins를 실행할 때 중요한 3 단계는 다음과 같습니다.

  1. /var/run/docker.sock호스트에서 도커를 사용할 수 있도록 소켓 을 jenkins 컨테이너에 마운트합니다 .
  2. 컨테이너를 사용하려면 도커를 컨테이너 안에 설치해야합니다. 작업을 수행하는 방법에 대한 훌륭하고 간단한 기사입니다. 최신 버전에는 이미도 커가 설치되어있을 수 있습니다.
  3. sudo usermod -a -G docker jenkinsjenkins를 docker 그룹에 추가하기 위해 실행 합니다. 그러나 호스트 도커와 컨테이너 도커에 동일한 그룹 ID가 없으면 컨테이너 도커의 gid를 호스트 도커 gid와 동일하게 조정하는 것이 매우 중요합니다.

시작 스크립트의 일부로 또는 exec수동으로 직접 사용 하고 수행 하여이 작업을 수행 할 수 있습니다 groupmod -g <YOUR_HOST_DOCKER_GID> docker.

또한 777 로의 권한변경하지 마십시오./var/run/docker.sock 보안상의 위험이 크기 때문에 기본적으로 모든 사람이 컴퓨터에서 도커를 사용할 수있는 권한을 부여 합니다

도움이 되었기를 바랍니다


1
감사합니다. 현재 Jenkins Docker 이미지의 경우 docker 명령이 이미 설치되어 있으며 apt-get은 설치되어 있지 않습니다. 다른 점-Jenkins를 올바른 그룹에 추가하고 GID가 Docker 호스트의 것과 일치하는지 확인하십시오. 에 딱 맞다.
Steve Bonds 19

1
그룹 ID 문제로 목숨을 구했습니다. 감사!
lenkovi

13

jenkins 사용자를 루트 그룹에 추가하고 jenkins를 다시 시작하여 작동하기 시작했습니다.

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

16
이것은 나쁜 보안 관행입니다. 선호되는 접근 방식은 이 답변 입니다.
kevindaub 2016 년

10

docker.sock 파일의 액세스 권한을 변경하십시오.

chmod 777 /var/run/docker.sock

또는 u는 sudo명령을 시작할 때 사용할 수 있습니다 .

chmod 777모든 사용자가 모든 작업을 chmod 666허용하고 파일을 읽고 쓸 수는 있지만 파일을 실행할 수는 없습니다.


이것이 내가 필요한 것입니다, 감사합니다!
crazynx

9

사용자를 위한 보조 그룹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는 에이전트가 사용해야하는 숫자 사용자 ID 및 숫자 그룹 ID를 제공합니다. 에이전트는 docker run컨테이너에 로그인하지 않기 때문에 보충 그룹 이 없습니다 (더 비슷합니다 sudo).

에이전트 용 Docker 설치

Docker 이미지에서 Docker 프로그램을 사용할 수있게하려면 Dockerfile에서 Docker 설치 단계 를 실행하면 됩니다.

# 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 설정

세 번째 문제에 대한 이상적인 해결책은 에이전트에 대한 보충 그룹을 설정하는 것입니다. 가능하지 않은 것 같습니다. 내가 아는 유일한 해결책은 Jenkins UID 및 Docker GID로 에이전트를 실행하는 것입니다 (소켓에는 그룹 쓰기 권한이 있으며이 소유합니다 root.docker). 그러나 일반적으로 해당 ID가 무엇인지 알지 못합니다 ( Jenkins와 Docker가 호스트에 설치되었을 때 ID가 할당 useradd ... jenkins되고 groupadd ... docker실행되었을 때). Jenkins에게 사용자 jenkins및 그룹 에게 간단하게 말할 수는 없습니다.docker

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

때문에 이름을 지정하는 사용자 및 그룹 사용 도커 지시 jenkinsdocker 이미지 내의 , 그리고 당신의 도커 이미지는 아마도이없는 jenkins사용자 및 그룹을, 그리고 그것을 한 경우에도 이 같은 UID와 GID로있을 것입니다 보장이 없을 것 dockerGID가 동일 하다는 보장은 없습니다.

다행히 Jenkins는 docker buildDockerfile에 대한 명령을 스크립트로 실행하므로 셸 스크립트 마술을 사용하여 해당 정보를 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얻가 명령을 UIDGID를jenkins사용자와 stat도커 소켓에 대한 정보를 얻기 위해 명령.

귀하의 Dockerfile는 설정 A는 해당 정보를 사용할 수있는 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

이것은 훌륭한 종합 솔루션이며 dockerfile을 통해 docker와 공유 된 docker socket을 사용할 때 나를 위해 일한 유일한 솔루션입니다. 자체 블로그 게시물이어야합니다. 감사합니다!
Greg Olmstead

통과 할 수있을 것 같 -u jenkins:$(getent group docker | cut -d: -f3)습니까?
Gillespie

다음 인수를 전달할 때, 다음과 같은 라인을 변경하려면 아마도 더 나은 args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'에 의해 args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker' -u 젠킨스를 전달할 때 : 사용자 쓰기 파일이 작업 공간에 말을 할 때 고정 표시기, 당신은 의미 기본 사용자 그룹을 변경, 그것은 파일을 설정합니다 사용자를 jenkins로, 그룹을 docker로 우리가 의도 한 것이 아닐 수도 있습니다.
니콜라스 포니

8

Jenkins가 Docker에서 실행 중이며 Jenkins가 호스트 시스템 Ubuntu 16.04의 Docker 소켓을 볼륨을 통해 /var/run/docker.sock으로 사용하고 있습니다.

나에게 해결책은 다음과 같습니다.

1) Jenkins의 Docker 컨테이너 내부 ( 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 의미-그룹의 소유자 및 사용자에 대한 읽기 및 쓰기 (실행은 아님).


이것은 로그인 / 로그인을 필요로하지 않는 유일한 솔루션입니다. 즉, 셸 스크립트에서이를 실행하려고 할 때 작동하는 솔루션입니다.
PV

3

프로덕션 구성을 수행하는 동안 권한 문제가 발생했습니다. 문제를 해결하기 위해 아래 솔루션을 시도했습니다.

에러 메시지

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/

2

필자의 경우 그룹 에 jenkins사용자를 추가해야 할 docker뿐만 아니라 해당 그룹을 jenkins사용자 의 기본 그룹으로 만들었습니다 .

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

경우에 따라 jenkins 슬레이브 노드를 다시 연결하거나 jenkins 서버를 다시 시작하는 것을 잊지 마십시오.


2

2019-02-16

대부분의 단계는 다른 단계에서 작성한 것과 동일합니다. 그러나 언급 된 솔루션으로 usermod를 사용하여 jenkins를 그룹 도커에 추가 할 수 없었습니다.

docker host실행중인 docker container 에서 다음 명령을 시도했습니다 .

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] jenkins의 비밀번호 :

비밀번호를 몰랐습니다.

sudo명령 의 일부가 없으면 도커 컨테이너 에서 다음을 받았습니다.

usermod : 권한이 거부되었습니다. usermod : / etc / passwd를 잠글 수 없습니다. 나중에 다시 시도하십시오.

솔루션 : 다음 명령 을 사용하여 docker 호스트 에서 실행중인 docker 컨테이너에 들어갔습니다 .

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

이제 root로 입력 하고 다음 명령을 실행했습니다.

usermod -a -G docker jenkins

그런 다음 docker host 에서 다음 명령을 사용하여 실행중인 docker 컨테이너 를 다시 시작했습니다 .

docker restart my_container_id_or_name

그 후, 나는 jenkins 작업을 시작했고 성공으로 끝났습니다.

루트 사용자 만 사용하여 사용자에게 usermod명령 을 내 렸습니다 jenkins.


2

2019-05-26

이것은 나를 위해 일했다!

도커 작성 예제 :

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"

2

비슷한 문제에 직면했습니다. 이는 권한 문제 이며이 문제의 원인은 Docker 데몬 / 서버가 항상 root사용자 로 실행되기 때문에 항상 docker 명령 앞에을 표시하기를 원하기 때문입니다 sudo.

Docker 데몬은 TCP 포트 대신 Unix 소켓에 바인딩됩니다. 기본적으로 Unix 소켓은 사용자가 소유 root하며 다른 사용자는을 사용해서 만 액세스 할 수 있습니다 sudo.

이 문제를 해결하려면 다음과 같이하십시오.

먼저, 도커 그룹이 이미 생성되어 있는지 확인하십시오.

cat /etc/group

docker표시된 목록에서 찾을 수 없으면 다음 목록을 작성해야합니다.

sudo groupadd docker

그런 다음 아래 명령을 사용하여 귀하 user와 귀하 group를 확인하십시오 .

cat /etc/group

도커 그룹을 보려면 스크롤하십시오. 이 형식이어야합니다

docker:x:140:promisepreston

어디에 docker내 인 grouppromisepreston제입니다user

이제 우리는 docker 그룹에 사용자를 추가 할 수 있습니다

Docker 컨테이너 파일 만 해당 :

도커 이미지 / 컨테이너 / 명령을 실행하려고하거나 실행하려고하거나 권한 문제를 일으키는 지 여부에 관계없이 터미널에서 아래 명령을 정확하게 수정하지 않은 상태로 복사하고 실행하십시오.

sudo usermod -aG docker $USER

위 명령을 실행 한 후 그룹 멤버쉽을 다시 평가하려면 로그 아웃했다가 다시 로그인해야합니다. 그러나 Linux에서는 아래 명령을 실행하여 그룹 변경 사항을 활성화 할 수 있습니다 ( 도커 이미지 / 컨테이너 / 명령에 관계없이 터미널에서 아래 명령을 수정하지 않고 정확하게 설명하는 방법을 복사하고 실행하십시오). 실행하려고하거나 실행하려고하거나 권한 문제가 발생했습니다 ) :

newgrp docker 

이제 권한 문제를 다시 일으키는 명령을 실행하여 sudo 권한없이 docker 명령을 실행할 수 있는지 확인할 수 있습니다 (예 : 이미지 / 컨테이너 / 명령의 이름으로 대체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/

참고 : 응용 프로그램 디렉토리가있는 상위 디렉토리 내에서이 명령을 실행하십시오.

그게 다야.

이게 도움이 되길 바란다



1

도커 컨테이너 내에서 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)

이것은 젠킨스 이미지에 도커 클라이언트가 설치되어 있다고 가정합니다. 참조 : https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci


1

아래와 같은 오류가 발생할 수 있습니다.

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

`sudo usermod -a -G docker $ USER '는 jenkins의 암호를 요구하지만, 사용자 암호가 무엇인지 확실하지 않습니다.
3lokh

Jenkins 사용자에게 sudo 권한을 부여해야한다고 생각합니다. 또는 당신은 루트 사용자에서 다음 명령을 시도 할 수 usermod -a -G docker jenkinschown jenkins:docker /var/run/docker.sock
lakshmikandan

소켓의 소유권을 jenkins로 변경해서는 안됩니다. 그리고 젠킨스가 아닌 일반 사용자가 sudo 액세스 권한을 가진대로 sudo를 실행해야합니다. 이 답변이 허용되는 답변에 추가하는 것은 무엇입니까?
Jim Stewart

1

나는 공식 젠킨스 도커 이미지 ( https://hub.docker.com/r/jenkins/jenkins )를 사용하고 있지만이 솔루션은 Docker 컨테이너 내에서 Docker를 실행하려는 대부분의 사용 사례에 적용 가능하다고 생각합니다.

Docker 컨테이너 내에서 Docker를 사용하는 데 권장되는 방법은 호스트 시스템의 Docker 데몬을 사용하는 것입니다. https://itnext.io/docker-in-docker-521958d34efd 에 관한 좋은 기사 .

이 질문에 대한 권한 문제를 처리하는 비밀 은 호스트 시스템이 아닌 컨테이너 내부의 컨테이너 사용자에게 권한을 추가 하는 것 입니다. 루트 사용자 만이 기본적으로 그렇게 할 권한이 있으므로

docker exec -it -u root <container-name> bash
usermod -a -G docker <username>

할 것입니다. 컨테이너를 다시 시작해야합니다.

이것을 달성하는 가장 간단한 방법은 맞춤형 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 이미지에 전체 도커를 설치할 필요가 없습니다. 내 답변 참조
deFreitas

1

누군가 로컬 컴퓨터 (우분투)에서 여전히 문제에 직면하고 있다면 아래 명령을 시도하십시오.

sudo chmod 666 /var/run/docker.sock

1

내 경우에는 성공적으로 작동합니다. 로컬 저장소를 탐색하고이 명령을 입력하십시오.

sudo chmod 666 /var/run/docker.sock

0

Jenkins가 실행되는 서버에서

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

그런 다음 각 도커 컨테이너를

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

setfacl을 사용하는 것이 더 나은 옵션으로 보이고 "-u user"가 필요하지 않습니다. 그런 다음 컨테이너는 Jenkins를 실행하는 동일한 사용자로 실행됩니다. 그러나 보안 전문가의 의견에 감사드립니다.


0

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


0

종종 새 사용자 그룹과 사용자에게 적용하려면 재부팅해야합니다.


0

도커 컨테이너 내에서 Jenkins를 실행 중이고 Jenkins가 호스트 도커에 연결되어 있으면 아래의 Dockerfile만으로 문제를 해결할 수 있습니다.

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

-6

어쩌면 처음부터 "-u root"옵션으로 도커를 실행해야 할 수도 있습니다.

적어도 그것은 내 문제를 해결했다.


1
그러면 user로 파일이 생성 될 수 있습니다 root. Docker 18.06.1에서는 적어도 이것이 나에게 일어난 일입니다.
Ernst de Haan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.