Docker: Đã bị từ chối trong khi cố gắng kết nối với ổ cắm Docker daemon tại unix: ///var/run/docker.sock


175

Tôi mới đến docker. Tôi vừa thử sử dụng docker trong máy cục bộ của mình (Ubuntu 16.04) với Jenkins.

Tôi đã cấu hình một công việc mới với kịch bản đường ống bên dưới.

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

Nhưng nó thất bại với lỗi dưới đây.

nhập mô tả hình ảnh ở đây


1
nó là một Jenkins nguyên khối hay có một thiết lập chủ nô? Kiểm tra xem người dùng nào bạn đang thực hiện lệnh kiểm tra docker. Xem nếu /var/run/docker.sock có quyền truy cập RW vào nhóm.
Ram Kamath


2
Các bước sau khi cài đặt docker
radistao 26/07/19

Câu trả lời:


294

Người dùng jenkinscần được thêm vào nhómdocker :

sudo usermod -a -G docker jenkins

Sau đó khởi động lại Jenkins.

Biên tập

Nếu bạn gặp phải câu hỏi về lỗi tràn ngăn xếp này vì bạn nhận được thông báo này từ docker, nhưng bạn không sử dụng jenkins, rất có thể lỗi là như nhau: người dùng không có quyền của bạn không thuộc nhóm docker.

Bạn có thể làm:

sudo usermod -a -G docker alice

hoặc bất cứ tên người dùng của bạn là gì.

Bạn có thể kiểm tra nó ở cuối làm grep docker /etc/groupvà thấy một cái gì đó như thế này:

docker:x:998:alice

trong một trong những dòng

Sau đó thay đổi ID nhóm người dùng của bạn thành docker:

newgrp docker

88
và người dùng relogin
Ilya Kolesnikov

8
Câu trả lời hay, nhưng để chung chung hơn, chúng ta có thể làm điều này: sudo usermod -a -G docker $USERvà đăng xuất hoặc khởi động lại. liên kết
Julien Nyambal

10
Tôi đã phải khởi động lại máy chủ của mình để nó thực sự hoạt động.
etagwerker

3
Tôi đã phải ngắt kết nối / kết nối lại các nút của mình để nó hoạt động (chúng được kết nối qua ssh)
GaspardP

28
Không cần phải đăng nhập lại, chỉ cần sử dụng newgrp dockerthay thế trong cùng một phiên cuối.
C14L

69

Giải pháp đầu tiên của tôi là:

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

Nhưng không ai trong số họ làm việc cho tôi, tôi đã thử:

chmod 777 /var/run/docker.sock

Điều đó hoạt động, nhưng tôi không biết nếu đó là cuộc gọi đúng.


4
Lý do tại sao nó thất bại có lẽ là vì bạn phải mở lại thiết bị đầu cuối. Nó đã thất bại sau khi thực hiện 664, nhưng sau đó tôi đã mở một lớp vỏ mới.
PHGamer

1
Tôi đã thử mở lại, nhưng nó chỉ bắt đầu hoạt động sau chmod 777 cuối cùng
mỉa mai

vấn đề là sau khi khởi động lại 777 đã được đặt lại thành 660. Điều đã khắc phục vấn đề đối với tôi là 'usermod -aG users jenkins'.
mỉa mai

Tôi nhận ra rằng nó đã được đặt lại, nhưng không đặt quyền docker.sock thành 777. Điều này mang lại cho bất kỳ ai root trên hệ thống của bạn. Họ có thể nói chuyện với docker và tạo các container đặc quyền mà không bị hạn chế.
Lance Hudson

3
Mặc dù điều này có hiệu quả với tác giả và thậm chí đối với tôi, nhưng việc truy cập nhiều hơn vào docker.socktệp không phải là giải pháp tốt nhất, bạn chỉ cần thực hiện usermod... hướng dẫn và sau đó khởi động lại hệ thống của mình, nếu không nó không có hiệu lực
Mariano Ruiz

32

Thành công cho tôi

sudo usermod -a -G docker $USER
reboot

4
không cần khởi động lại. Chỉ cần đăng xuất rồi đăng nhập lại. Tôi đang nói về usermod
Abdennour TOUMI

1
Trên Ubuntu 18.04, tôi phải khởi động lại để cài đặt hoạt động.
Nikhil

1
Trên Ubuntu 20.04 tôi cần khởi động lại. Đóng phiên không đủ.
framontb

Hoặc chạy su $ {USER} thay vì đăng xuất
truy cập

19

2018-08-19

Tôi đã bị mắc kẹt trong nhiều ngày về vấn đề này và vì tôi chưa tìm thấy câu trả lời hoàn chỉnh với lý do và cách thức, tôi sẽ đăng một bài cho những người khác vấp phải cùng một vấn đề và câu trả lời từ trên không hoạt động.

Đây là 3 bước quan trọng khi chạy Jenkins bên trong docker:

  1. Bạn gắn ổ cắm /var/run/docker.sockvào thùng chứa jenkins để có thể sử dụng docker từ máy chủ.
  2. Bạn phải cài đặt docker bên trong container để sử dụng nó. Đây là một bài viết tuyệt vời và đơn giản về cách làm điều đó. Lưu ý rằng các phiên bản mới hơn có thể đã được cài đặt docker
  3. Bạn chạy sudo usermod -a -G docker jenkinsđể thêm jenkins vào nhóm docker. Tuy nhiên, ở đây bạn có thể gặp phải sự cố về quyền nếu docker máy chủ và docker container không có cùng id nhóm, do đó, điều rất quan trọng là điều chỉnh gid của docker giống như gid của docker

Bạn có thể làm điều này như một phần của tập lệnh khởi chạy hoặc đơn giản bằng cách sử dụng execvà thực hiện thủ công:groupmod -g <YOUR_HOST_DOCKER_GID> docker .

Ngoài ra, không thay đổi quyền của /var/run/docker.sock777 hoặc những thứ tương tự vì đó là một rủi ro bảo mật lớn, về cơ bản bạn đang cung cấp cho tất cả mọi người quyền sử dụng docker trên máy của bạn

Hi vọng điêu nay co ich


1
Cảm ơn-- lưu ý rằng đối với các hình ảnh Docker Jenkins hiện tại, các lệnh docker đã được cài đặt (và apt-get thì không.) Các điểm khác của bạn - thêm Jenkins vào nhóm bên phải và đảm bảo GID khớp với một từ máy chủ Docker, vẫn còn tại chỗ trên.
Steve Bonds

1
Cứu mạng tôi với vấn đề id nhóm. Cảm ơn!
lenkovi

13

Tôi đã thêm người dùng jenkins vào nhóm root và khởi động lại jenkins và nó bắt đầu hoạt động.

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

16
Đây là một thực hành bảo mật xấu. Cách tiếp cận ưa thích là câu trả lời này .
kevindaub

10

Thay đổi quyền truy cập của tệp docker.sock

chmod 777 /var/run/docker.sock

hoặc u có thể sử dụng sudokhi bắt đầu lệnh.

chmod 777sẽ cho phép tất cả các hành động cho tất cả người dùng trong khi chmod 666sẽ cho phép tất cả người dùng đọc và viết nhưng không thể thực thi tệp.


Đây là những gì tôi cần, cảm ơn!
crazynx

9

Chỉ cần thêm dockerdưới dạng nhóm bổ sung cho jenkinsngười dùng

sudo usermod -a -G docker jenkins

không phải lúc nào cũng đủ khi sử dụng hình ảnh Docker làm Đại lý Jenkins . Đó là, nếu bạn Jenkinsfilebắt đầu bằng pipeline{agent{dockerfilehoặc pipeline{agent{image:

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

Điều này là do Jenkins thực hiện một docker runlệnh, dẫn đến ba vấn đề.

  • Tác nhân sẽ (có thể) không cài đặt các chương trình Docker.
  • Tác nhân sẽ không có quyền truy cập vào ổ cắm Docker daemon và vì vậy sẽ cố gắng chạy Docker-in-Docker, điều này không được khuyến khích .
  • Jenkins cung cấp ID người dùng số và ID nhóm số mà Tác nhân nên sử dụng. Đại lý sẽ không có bất kỳ nhóm bổ sung nào, vì docker runkhông đăng nhập vào container (nó giống như một sudo).

Cài đặt Docker cho Đại lý

Làm cho các chương trình Docker có sẵn trong hình ảnh Docker chỉ cần yêu cầu chạy các bước cài đặt Docker trong Dockerfile của bạn:

# 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

...

Chia sẻ ổ cắm Docker daemon

Như đã nói trước đây , khắc phục sự cố thứ hai có nghĩa là chạy container Jenkins Docker để nó chia sẻ ổ cắm Docker daemon với daemon Docker bên ngoài container. Vì vậy, bạn cần nói với Jenkins để chạy bộ chứa Docker với chia sẻ đó, do đó:

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

Đặt UID và GID

Cách khắc phục lý tưởng cho vấn đề thứ ba sẽ là thiết lập các nhóm bổ sung cho Đại lý. Điều đó dường như không thể. Cách khắc phục duy nhất tôi biết là chạy Đại lý với Jenkins UID và Docker GID (ổ cắm có quyền ghi nhóm và được sở hữu bởi root.docker). Nhưng nói chung, bạn không biết những ID đó là gì (chúng được phân bổ khi useradd ... jenkinsgroupadd ... dockerchạy khi Jenkins và Docker được cài đặt trên máy chủ). Và bạn không thể đơn giản nói với Jenkins cho người dùng jenkinsvà nhóm người dùngdocker

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

bởi vì điều đó cho Docker sử dụng người dùng và nhóm được đặt tên jenkinsdocker trong hình ảnh , và hình ảnh Docker của bạn có thể không có jenkinsngười dùng và nhóm, và ngay cả khi nó không có gì đảm bảo nó sẽ có cùng UID và GID như máy chủ lưu trữ, và tương tự không có gì đảm bảo rằngdocker GID giống nhau

May mắn thay, Jenkins chạy docker buildlệnh cho Dockerfile của bạn trong một tập lệnh, vì vậy bạn có thể thực hiện một số phép thuật shell-script để truyền thông tin đó dưới dạng các đối số xây dựng 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'
        }
    }

Điều đó sử dụng idlệnh để lấy UIDGID của jenkinsngười dùng vàstat lệnh để lấy thông tin về ổ cắm Docker.

Dockerfile bạn có thể sử dụng thông tin đó để thiết lập một jenkinsngười dùng và dockernhóm cho các Đại lý, sử dụng groupadd, groupmoduseradd:

# 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

Đây là một giải pháp toàn diện tuyệt vời và là giải pháp duy nhất phù hợp với tôi khi sử dụng ổ cắm docker được chia sẻ với docker thông qua dockerfile. Nó nên là bài viết trên blog của riêng nó. Cảm ơn vì điều đó!
Greg Olmstead

Có vẻ như bạn có thể vượt qua -u jenkins:$(getent group docker | cut -d: -f3)?
Gillespie

Khi truyền các đối số, có lẽ tốt hơn là thay đổi dòng sau: args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker'bởi args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker' Khi truyền -u jenkins: docker, bạn thay đổi nhóm người dùng chính, có nghĩa là khi người dùng viết một tệp, giả sử trong không gian làm việc, nó sẽ đặt tệp người dùng để jenkins và nhóm để docker. Mà có lẽ không phải là những gì chúng tôi dự định.
Nicolas Forney

8

Tôi có Jenkins đang chạy trong Docker và Jenkins được kết nối đang sử dụng ổ cắm Docker từ máy chủ Ubuntu 16.04 thông qua âm lượng đến /var/run/docker.sock.

Đối với tôi giải pháp là:

1) Bên trong container Docker của Jenkins ( docker exec -it jenkins bashtrên máy chủ)

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

2) Trên máy chủ:

sudo service docker restart

664 có nghĩa là - đọc và viết (nhưng không thực thi) cho chủ sở hữu và người dùng trong nhóm.


Đây là giải pháp duy nhất không yêu cầu đăng nhập / đăng nhập, tức là giải pháp hoạt động khi cố gắng chạy nó trong tập lệnh shell.
PV

3

Trong khi thực hiện cấu hình sản xuất, tôi gặp vấn đề về sự cho phép. Tôi đã thử giải pháp bên dưới để giải quyết vấn đề.

Thông báo lỗi

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'.

Giải pháp: quyền của ổ cắm được chỉ định trong thông báo lỗi, /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

Sau khi thay đổi quyền cho docket.sock, sau đó thực hiện lệnh bên dưới để kiểm tra quyền.

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

Trong trường hợp của tôi, không chỉ cần thêm jenkinsngười dùng vào dockernhóm mà còn biến nhóm đó thành nhóm chính của jenkinsngười dùng.

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

Đừng quên kết nối lại nút nô lệ của jenkins hoặc khởi động lại máy chủ jenkins, tùy thuộc vào trường hợp của bạn.


2

2019/02/2016

Hầu hết các bước là giống nhau đối với tôi như những người khác đã viết. Tuy nhiên, tôi không thể thêm jenkins vào docker nhóm bằng usermod với các giải pháp được đề cập.

Tôi đã thử lệnh sau từ máy chủ docker và từ container docker đang chạy :

sudo usermod -a -G docker jenkins

(Tôi đã nhập vào bộ chứa docker đang chạy bằng lệnh sau từ máy chủ docker :

docker exec -t -i my_container_id_or_name /bin/bash

)

Nhận được từ máy chủ docker :

usermod: người dùng 'jenkins' không tồn tại

Nhận được từ container docker :

Chúng tôi tin rằng bạn đã nhận được bài giảng thông thường từ Quản trị viên Hệ thống địa phương. Nó thường sôi theo ba điều sau:

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

[sudo] mật khẩu cho jenkins:

Tôi không biết mật khẩu.

Không có sudophần lệnh, trong container docker tôi nhận được:

usermod: Quyền bị từ chối. usermod: không thể khóa / etc / passwd; thử lại sau.

Giải pháp: Tôi đã nhập vào bộ chứa docker đang chạy từ máy chủ docker bằng lệnh sau:

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

Bây giờ, tôi đã nhập bằng root và ban hành lệnh sau:

usermod -a -G docker jenkins

Sau đó, từ máy chủ docker , tôi khởi động lại container docker đang chạy của mình bằng lệnh sau:

docker restart my_container_id_or_name

Sau đó, tôi bắt đầu công việc jenkins và nó đã kết thúc thành công.

Tôi chỉ sử dụng người dùng root để ban hành usermodlệnh cho người dùng jenkins.


2

2019-05-26

Điều này làm việc cho tôi!

Ví dụ 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"

2

Tôi gặp phải một vấn đề tương tự, đó là vấn đề cấp phép và nguyên nhân của vấn đề này là do Docker daemon / server luôn chạy như rootngười dùng và muốn bạn luôn mở đầu lệnh docker vớisudo .

Docker daemon liên kết với một ổ cắm Unix thay vì cổng TCP. Theo mặc định, ổ cắm Unix được sở hữu bởi người dùng rootvà những người dùng khác chỉ có thể truy cập nó bằng cách sử dụngsudo .

Để khắc phục điều này, đây là những gì làm việc cho tôi:

Đầu tiên, hãy kiểm tra xem bạn đã tạo nhóm docker chưa:

cat /etc/group

Nếu bạn không tìm thấy dockertrong danh sách được hiển thị, thì bạn sẽ cần tạo một:

sudo groupadd docker

Tiếp theo, xác nhận của bạn uservà của bạn groupbằng cách sử dụng lệnh dưới đây:

cat /etc/group

Cuộn qua để xem nhóm cho docker. Nó phải là định dạng này

docker:x:140:promisepreston

nơi dockerlà của tôi grouppromiseprestonlà của tôiuser

Bây giờ chúng tôi có thể thêm người dùng của bạn vào nhóm docker

Chỉ dành cho Tệp Container Docker:

Sao chép và chạy lệnh bên dưới trong thiết bị đầu cuối của bạn chính xác như thế nào được nêu mà không sửa đổi nó trong bất kỳ hình thức nào, bất kể hình ảnh / container / lệnh docker mà bạn muốn chạy hoặc đang cố chạy hoặc đang gặp phải vấn đề về quyền:

sudo usermod -aG docker $USER

Sau khi chạy lệnh trên, bạn sẽ cần Đăng xuất và đăng nhập lại để thành viên nhóm của bạn được đánh giá lại. Tuy nhiên, trên Linux, bạn cũng có thể chạy lệnh sau bên dưới để kích hoạt các thay đổi cho các nhóm ( Sao chép và chạy lệnh bên dưới trong thiết bị đầu cuối của bạn chính xác như thế nào được nêu mà không sửa đổi nó trong bất kỳ hình thức nào, bất kể hình ảnh / container / lệnh docker nào bạn muốn chạy hoặc đang cố chạy hoặc đang gặp phải vấn đề về quyền ):

newgrp docker 

Bây giờ bạn có thể xác minh rằng bạn có thể chạy các lệnh docker mà không cần quyền sudo, bằng cách chạy lệnh gây ra sự cố quyền lần nữa, giả sử ( Thay thế my-commandbằng tên của hình ảnh / container / lệnh của bạn ):

docker run my-command

Đối với các tệp Docker và tệp hệ thống cục bộ:

Nếu bạn có một bản sao của các tệp trên hệ thống tệp cục bộ của mình, thì bạn có thể thay đổi quyền sở hữu của thư mục ứng dụng nơi tệp ứng dụng được lưu trữ, sử dụng định dạng này:

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

Vì vậy, trong trường hợp của tôi, nó sẽ là:

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

Ghi chú: Vui lòng chạy lệnh này trong thư mục mẹ chứa thư mục ứng dụng.

Đó là tất cả.

Tôi hi vọng cái này giúp được



1

Tôi đang chạy Jenkins bên trong một container docker. Giải pháp đơn giản nhất đối với tôi là tạo một hình ảnh tùy chỉnh tự động thiết lập GID, như:

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

Xem: https://github.com/jenkinsci/docker/issues/263

Ngoài ra, bạn có thể khởi chạy jenkins với các tùy chọn sau:

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

Điều này giả định hình ảnh jenkins của bạn đã cài đặt máy khách docker. Xem: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci


1

Nếu bạn có thể gặp lỗi như dưới đây,

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

hoặc là

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"

Chỉ cần cố gắng thực hiện các lệnh sau,

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

`sudo usermod -a -G docker $ USER 'sẽ hỏi mật khẩu của jenkins, không chắc mật khẩu người dùng là gì.
3lokh

Tôi nghĩ bạn nên cấp quyền sudo cho người dùng Jenkins. hoặc bạn có thể thử với lệnh sau trong người dùng root usermod -a -G docker jenkinschown jenkins:docker /var/run/docker.sock
lakshmikandan

Bạn không nên thay đổi quyền sở hữu của ổ cắm thành jenkins. Và bạn nên chạy sudo như bất cứ người dùng bình thường nào có quyền truy cập sudo, không phải là jenkins. Câu trả lời này thêm gì vào câu trả lời được chấp nhận?
Jim Stewart

1

Tôi đang sử dụng hình ảnh docker jenkins chính thức ( https://hub.docker.com/r/jenkins/jenkins ) nhưng tôi nghĩ giải pháp này có thể áp dụng cho hầu hết các trường hợp sử dụng khi chúng tôi muốn chạy Docker bên trong container Docker.

Cách được đề xuất để sử dụng Docker bên trong thùng chứa Docker, là sử dụng deamon Docker của hệ thống máy chủ. Bài viết hay về điều đó: https://itnext.io/docker-in-docker-521958d34efd .

Bí quyết để xử lý vấn đề cấp phép, mà câu hỏi này là về, là thêm quyền cho người dùng của container bên trong container chứ không phải hệ thống máy chủ . Chỉ người dùng root mới có quyền làm điều đó theo mặc định, vì vậy

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

sẽ làm điều đó. Nhớ khởi động lại container.

Tôi đoán cách đơn giản nhất để đạt được điều này là tạo Dockerfile tùy chỉnh:

# 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

Không cần phải cài đặt toàn bộ docker trên hình ảnh Jenkins, hãy xem câu trả lời của tôi
deFreitas

1

Nếu ai đó vẫn đang đối mặt với sự cố trên máy cục bộ của họ (Ubuntu) thì hãy thử lệnh dưới đây:

sudo chmod 666 /var/run/docker.sock

1

Trong trường hợp của tôi, điều này sẽ làm việc thành công. điều hướng repo địa phương của bạn và nhập lệnh này.

sudo chmod 666 /var/run/docker.sock

0

Trên máy chủ nơi Jenkins đang chạy, tôi đã sử dụng

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

Và sau đó chạy từng container docker với

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

Sử dụng setfacl có vẻ là một lựa chọn tốt hơn và không cần "người dùng -u". Các container sau đó chạy như cùng một người dùng đang chạy Jenkins. Nhưng tôi sẽ đánh giá cao bất kỳ thông tin phản hồi từ các chuyên gia bảo mật.


0

sử dụng bên dưới 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

trong trường hợp của tôi, nó chỉ mới bắt đầu dịch vụ docker:

sudo service docker start

0

thường cần khởi động lại để có hiệu lực đối với nhóm người dùng và người dùng mới.


0

Nếu bạn đang chạy Jenkins bên trong một container docker và Jenkins của bạn đang liên kết với docker máy chủ thì bạn có thể khắc phục điều đó chỉ bằng Dockerfile bên dưới:

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

-6

Có lẽ bạn nên chạy docker với tùy chọn "-u root" ngay từ đầu

Ít nhất điều đó đã giải quyết vấn đề của tôi


1
Sau đó, bạn có thể nhận được các tập tin được tạo như người dùng root. Ít nhất đây là những gì đã xảy ra với tôi, với Docker 18.06.1.
Ernst de Haan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.