[docker] Docker : unix : ///var/run/docker.sock에서 Docker 데몬 소켓에 연결하는 동안 권한이 거부되었습니다.
도커를 처음 사용합니다. Jenkins와 함께 로컬 컴퓨터 (Ubuntu 16.04)에서 도커를 사용하려고했습니다.
아래 파이프 라인 스크립트로 새 작업을 구성했습니다.
node {
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
그러나 아래 오류로 실패합니다.
답변
사용자 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
답변
첫 번째 해결책은 다음과 같습니다.
usermod -aG docker jenkins
usermod -aG root jenkins
chmod 664 /var/run/docker.sock
그러나 그들 중 누구도 나를 위해 일하지 않습니다.
chmod 777 /var/run/docker.sock
그것은 효과가 있지만 그것이 올바른 전화인지는 모르겠습니다.
답변
나를위한 성공
sudo usermod -a -G docker $USER
reboot
답변
2018-08-19
나는 이것에 며칠 동안 붙어 있었고 그 이유와 방법에 대한 완전한 대답을 찾지 못했기 때문에 같은 문제에 걸려 넘어지는 다른 사람들을 위해 하나를 게시 할 것이며 위의 대답은 효과가 없습니다.
docker 내에서 Jenkins를 실행할 때 중요한 3 단계는 다음과 같습니다.
/var/run/docker.sock
호스트에서 도커를 사용할 수 있도록 소켓 을 jenkins 컨테이너에 마운트합니다 .- 컨테이너를 사용하려면 도커를 컨테이너 안에 설치해야합니다. 이 작업을 수행하는 방법에 대한 훌륭하고 간단한 기사입니다. 최신 버전에는 이미도 커가 설치되어있을 수 있습니다.
sudo usermod -a -G docker jenkins
jenkins를 docker 그룹에 추가하기 위해 실행 합니다. 그러나 호스트 도커와 컨테이너 도커에 동일한 그룹 ID가 없으면 컨테이너 도커의 gid를 호스트 도커 gid와 동일하게 조정하는 것이 매우 중요합니다.
시작 스크립트의 일부로 또는 exec
수동으로 직접 사용 하고 수행 하여이 작업을 수행 할 수 있습니다 groupmod -g <YOUR_HOST_DOCKER_GID> docker
.
또한 777 로의 권한 을 변경하지 마십시오./var/run/docker.sock
보안상의 위험이 크기 때문에 기본적으로 모든 사람이 컴퓨터에서 도커를 사용할 수있는 권한을 부여 합니다
도움이 되었기를 바랍니다
답변
jenkins 사용자를 루트 그룹에 추가하고 jenkins를 다시 시작하여 작동하기 시작했습니다.
sudo usermod -a -G root jenkins
sudo service jenkins restart
답변
docker.sock 파일의 액세스 권한을 변경하십시오.
chmod 777 /var/run/docker.sock
또는 u는 sudo
명령을 시작할 때 사용할 수 있습니다 .
chmod 777
모든 사용자가 모든 작업을 chmod 666
허용하고 파일을 읽고 쓸 수는 있지만 파일을 실행할 수는 없습니다.
답변
사용자를 위한 보조 그룹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'
때문에 그 이름을 지정하는 사용자 및 그룹 사용 도커 지시 jenkins
와 docker
이미지 내의 , 그리고 당신의 도커 이미지는 아마도이없는 jenkins
사용자 및 그룹을, 그리고 그것을 한 경우에도 이 같은 UID와 GID로있을 것입니다 보장이 없을 것 docker
GID가 동일 하다는 보장은 없습니다.
다행히 Jenkins는 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
도커 소켓에 대한 정보를 얻기 위해 명령.
귀하의 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