도커를 처음 사용합니다. Jenkins와 함께 로컬 컴퓨터 (Ubuntu 16.04)에서 도커를 사용하려고했습니다.
아래 파이프 라인 스크립트로 새 작업을 구성했습니다.
node {
stage('Build') {
docker.image('maven:3.3.3').inside {
sh 'mvn --version'
}
}
}
그러나 아래 오류로 실패합니다.
도커를 처음 사용합니다. 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
sudo usermod -a -G docker $USER
로그 아웃 또는 재부팅. 링크
newgrp docker
동일한 터미널 세션에서 대신 사용하십시오 .
첫 번째 해결책은 다음과 같습니다.
usermod -aG docker jenkins
usermod -aG root jenkins
chmod 664 /var/run/docker.sock
그러나 그들 중 누구도 나를 위해 일하지 않습니다.
chmod 777 /var/run/docker.sock
그것은 효과가 있지만 그것이 올바른 전화인지는 모르겠습니다.
docker.sock
파일에 대한 더 많은 액세스 권한을 부여 하는 것이 최선의 해결책은 아닙니다 usermod
. 명령 만 실행 한 다음 시스템을 재부팅하면됩니다. 그렇지 않으면 적용되지 않습니다
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
으로 간단하게 추가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 run
컨테이너에 로그인하지 않기 때문에 보충 그룹 이 없습니다 (더 비슷합니다 sudo
).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
...
앞에서 말했듯 이 두 번째 문제를 해결하는 것은 Jenkins Docker 컨테이너를 실행하여 컨테이너 외부 의 Docker 데몬과 Docker 데몬 소켓을 공유하는 것을 의미합니다 . 따라서 Jenkins에게 그 공유로 Docker 컨테이너를 실행하도록 지시해야합니다.
pipeline {
agent {
dockerfile {
filename 'Dockerfile.jenkinsAgent'
args '-v /var/run/docker.sock:/var/run/docker.sock'
}
}
세 번째 문제에 대한 이상적인 해결책은 에이전트에 대한 보충 그룹을 설정하는 것입니다. 가능하지 않은 것 같습니다. 내가 아는 유일한 해결책은 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
-u jenkins:$(getent group docker | cut -d: -f3)
습니까?
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로 우리가 의도 한 것이 아닐 수도 있습니다.
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
의미-그룹의 소유자 및 사용자에 대한 읽기 및 쓰기 (실행은 아님).
프로덕션 구성을 수행하는 동안 권한 문제가 발생했습니다. 문제를 해결하기 위해 아래 솔루션을 시도했습니다.
에러 메시지
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/
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
.
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"
비슷한 문제에 직면했습니다. 이는 권한 문제 이며이 문제의 원인은 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
내 인 group
및 promisepreston
제입니다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/
참고 : 응용 프로그램 디렉토리가있는 상위 디렉토리 내에서이 명령을 실행하십시오.
그게 다야.
이게 도움이 되길 바란다
도커 컨테이너 내에서 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
아래와 같은 오류가 발생할 수 있습니다.
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
usermod -a -G docker jenkins
와chown jenkins:docker /var/run/docker.sock
나는 공식 젠킨스 도커 이미지 ( 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
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
어쩌면 처음부터 "-u root"옵션으로 도커를 실행해야 할 수도 있습니다.
적어도 그것은 내 문제를 해결했다.
root
. Docker 18.06.1에서는 적어도 이것이 나에게 일어난 일입니다.