簡體   English   中英

Docker:嘗試連接到位於 unix:///var/run/docker.sock 的 Docker 守護程序套接字時,權限被拒絕

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

我是 docker 的新手。我只是嘗試在我的本地機器(Ubuntu 16.04)中使用 docker 和 Jenkins。

我使用以下管道腳本配置了一個新作業。

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

但它失敗並出現此錯誤:

嘗試連接到位於 unix 的 Docker 守護程序套接字時,權限被拒絕:///var/run/docker.sock

在此處輸入圖像描述

如果使用詹金斯

需要將用戶jenkins添加到組docker中:

sudo usermod -a -G docker jenkins

然后重啟詹金斯。

否則

如果您因為從 docker 收到此消息而遇到堆棧溢出的問題,但您沒有使用 jenkins,則很可能錯誤是相同的:您的非特權用戶不屬於 docker 組。

你可以做:

sudo usermod -a -G docker [user]

[user]所在的位置插入您的用戶名。

您可以通過執行grep docker /etc/group來檢查它是否成功,並看到如下內容:

docker:x:998:[user]

在其中一條線上。

然后將您的用戶組 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 個關鍵步驟:

  1. 您將套接字/var/run/docker.sock安裝到 jenkins 容器,以便能夠從主機使用 docker。
  2. 您必須在容器內安裝 docker 才能使用它。 是一篇關於如何做到這一點的偉大而簡單的文章。 請注意,較新的版本可能已經安裝了 docker
  3. 您運行sudo usermod -a -G docker jenkins以將 jenkins 添加到 docker 組。 但是,如果主機 docker 和容器 docker 沒有相同的組 id,則在這里您可能會遇到權限問題,因此將容器 docker 的 gid 調整為與主機 docker gid 相同非常重要

您可以將其作為啟動腳本的一部分執行,也可以簡單地使用exec並手動執行: groupmod -g <YOUR_HOST_DOCKER_GID> docker

另外,不要/var/run/docker.sock的權限更改為 777 或類似的東西,因為這是一個很大的安全風險,您基本上是在授予每個人在您的機器上使用 docker 的權限

希望這可以幫助

更改 docker.sock 文件的訪問權限

chmod 777 /var/run/docker.sock

或者你可以在命令的開頭使用sudo

chmod 777將允許所有用戶執行所有操作,而chmod 666將允許所有用戶讀取和寫入但不能執行文件。

方法 01 :- 更安全的方法

sudo usermod -aG docker ${USER}

要應用新的組成員資格,請退出服務器並重新登錄,或鍵入以下內容:

su - ${USER}

系統將提示您輸入用戶密碼以繼續。 通過鍵入以下內容確認您的用戶現在已添加到 docker 組:

id -nG

方法 02 :- 不推薦用於公共部署(不安全)

chmod 777 /var/run/docker.sock

或使用

sudo chown root:docker /var/run/docker.sock

這在Ubuntu 20.04中對我有用

sudo chmod 666 /var/run/docker.sock

不知道它到底做了什么,但解決了問題。

我將 jenkins 用戶添加到 root 組並重新啟動 jenkins 並開始工作。

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

只需docker添加為jenkins用戶的補充組

sudo usermod -a -G docker jenkins

將 Docker 映像用作Jenkins 代理時並不總是足夠的。 也就是說,如果您的Jenkinsfilepipeline{agent{dockerfilepipeline{agent{image開頭:

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

這是因為 Jenkins 執行了一個docker run命令,導致了三個問題。

  • 代理將(可能)沒有安裝 Docker 程序。
  • Agent 將無法訪問 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 是什么(它們是在useradd ... jenkinsgroupadd ... docker docker 在主機上安裝 Jenkins 和 Docker 時運行時分配的)。 而且你不能簡單地告訴 Jenkins 用戶用戶jenkins和組docker

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

因為告訴 Docker在鏡像中使用名為jenkinsdocker的用戶和組,並且您的 Docker 鏡像可能沒有jenkins用戶和組,即使有也不能保證它具有相同的 UID和 GID 作為主機,同樣不能保證docker GID 相同

幸運的是,Jenkins 在腳本中為您的 Dockerfile 運行 docker docker build命令,因此您可以使用一些 shell 腳本魔術來將該信息作為 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命令獲取jenkins用戶的UIDGID ,使用stat命令獲取有關 Docker 套接字的信息。

您的 Dockerfile 可以使用該信息為代理設置jenkins用戶和docker組,使用groupaddgroupmoduseradd

# 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

我遇到了類似的問題,這是一個權限問題,這個問題的原因是因為 Docker 守護程序/服務器始終以root用戶身份運行,並且希望您始終在 docker 命令前加上sudo

Docker 守護進程綁定到 Unix 套接字而不是 TCP 端口。 默認情況下,Unix 套接字由用戶root擁有,其他用戶只能使用sudo訪問它。

為了解決這個問題,這對我有用:

首先,檢查您是否已經創建了一個 docker 組:

cat /etc/group

如果您在顯示的列表中沒有找到docker ,那么您將需要創建一個:

sudo groupadd docker

接下來,使用以下命令確認您的user和您的group

cat /etc/group

滾動查看 docker 組。 應該是這種格式

docker:x:140:promisepreston

docker是我的grouppromisepreston是我的user

現在我們可以將您的用戶添加到 docker 組

還將您的用戶添加到“docker”組,如果您想以非 root 用戶身份使用 Docker:

無論您要運行或嘗試運行或導致權限問題的 docker 映像/容器/命令如何,都可以在終端中准確復制並運行以下命令,而無需以任何方式對其進行修改:

sudo usermod -aG docker $USER

運行上述命令后,您需要注銷並重新登錄,以便重新評估您的組成員身份。 但是,在 Linux 上,您也可以運行以下命令來激活對組的更改(無論 docker 映像/容器/命令如何,在您的終端中復制並運行下面的命令,無需以任何方式對其進行修改您想要運行或正在嘗試運行或導致權限問題):

newgrp docker

或者

sudo systemctl restart 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 在 Docker 中運行,並且連接的 Jenkins 正在使用主機 Ubuntu 16.04 通過卷到 /var/run/docker.sock 的 Docker 套接字。

對我來說,解決方案是:

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表示 - 為組中的所有者和用戶讀取和寫入(但不執行)。

第 1 步:將您的用戶名添加到docker組:

sudo usermod -a -G docker $USER

然后注銷並再次登錄。

第 2 步:然后更改 docker 組 ID:

newgrp docker

獎勵:檢查您的新組:

id -g

PS如果你有興趣,參考在這里

在進行生產配置時,我遇到了權限問題。我嘗試了以下解決方案來解決問題。

錯誤信息

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/

在我的情況下,不僅需要將jenkins用戶添加到docker組,而且使該組成為jenkins用戶的主要組。

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

不要忘記重新連接 jenkins 從節點或重新啟動 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"

2019-02-16

大多數步驟對我來說和其他人寫的一樣。 但是,我無法使用 usermod 和上述解決方案將 jenkins 添加到組 docker 中。

我從docker host正在運行的 docker 容器中嘗試了以下命令:

sudo usermod -a -G docker jenkins

(我使用來自docker 主機的以下命令進入正在運行的 docker 容器

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] 詹金斯密碼:

我不知道密碼。

沒有命令的sudo部分,在我收到的docker 容器中

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

在那之后,我開始了詹金斯的工作,並以成功告終。

我只使用root用戶為用戶jenkins發出usermod命令。

如果您可能會收到如下錯誤,

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

我正在使用官方的 jenkins docker 鏡像( 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 <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

就我而言,這將成功。 導航您的本地存儲庫並輸入此命令。

sudo chmod 666 /var/run/docker.sock
sudo usermod -a -G docker jenkins
sudo service jenkins restart

我在 docker 容器中運行 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

如果您在 docker 容器中運行 Jenkins,並且您的 Jenkins 正在鏈接到主機 docker,那么您可以通過下面的 Dockerfile 來修復它:

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

sudo setfacl --修改用戶:(用戶名或ID):rw /var/run/docker.sock

幾次我嘗試執行命令

sudo chmod 777 /var/run/docker.sock

但不幸的是,我每次登錄ubuntu系統時都必須這樣做。 它不需要重新啟動,並且比 usermod 或 chown 更安全。 當用戶名僅存在於容器內而不存在於主機上時,需要用戶 ID。

我希望它能幫助你解決問題。

檢查你的 docker 是否正在運行sudo systemctl status docker

檢查錯誤docker ps -a

授予權限sudo usermod -aG docker ${USER}下一個命令su - ${USER}

再次檢查它是否給出錯誤docker ps -a

我們有兩種方法來解決這個問題..

方法 1應用新的組成員

sudo usermod -aG docker ${USER}
su - ${USER}

方法2更改文件權限和組權限

chmod 777 /var/run/docker.sock
sudo chown root:docker /var/run/docker.sock

方法1是安全方法。

我遇到的問題是,如果我通過sudo chmod 666 /var/run/docker.sock授予權限,則在重新啟動 ubuntu 服務器后,docker 將失去訪問權限

因此,我需要通過以下方式將我的用戶名( ubuntu )添加到 docker 組: sudo usermod -aG docker ubuntu

在運行 Jenkins 的服務器上,我使用了

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

然后運行每個 docker 容器

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

使用 setfacl 似乎是一個更好的選擇,並且不需要“-u 用戶”。 然后容器以運行 Jenkins 的同一用戶身份運行。 但我會感謝安全專家的任何反饋。

在 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

就我而言,它只是啟動 docker 服務:

sudo service docker start

如果有人在他們的本地機器(Ubuntu)上仍然面臨這個問題,那么試試下面的命令:

sudo chmod 666 /var/run/docker.sock

如果您想保持簡單,請在fixdockergid上使用 fixdockergid。

除了將用戶添加到 docker 組並嘗試此線程中提到的所有內容之外,我花了一段時間才意識到我必須重新啟動終端,然后重新登錄到 ec2 實例。 在那之后它起作用了。

似乎沒有人提到,根據官方消息來源: https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user - 你可以“ pre" 你的命令與sudo並且它會在不創建用戶或其他操作的情況下工作。 例如sudo docker pull mongo - 這行得通。

將下面的“your_user”更改為真實用戶

echo "your_user ALL=(ALL) NOPASSWD: /usr/local/bin/docker, /usr/local/sbin/docker, /usr/bin/docker, /usr/sbin/docker, /bin/docker, /sbin/docker" > /etc/sudoers.d/sudo_docker

usermod -aG docker your_user

chmod 0660 /var/run/docker.sock

chown root:docker /var/run/docker.sock

我使用以下命令解決了這個問題:

sudo chmod 777 /var/run/docker.sock
sudo chown ${USER}:docker /var/run/docker.sock

經常需要重啟才能對新的用戶組和用戶生效。

我也能夠完成這項工作,而無需更改本地 unix 套接字 /var/run/docker.sock 的權限。 我要做的是在構建代理節點上啟用 tcp 連接,然后在 Jenkins 雲配置中指定 docker 主機。

假設您使用的是 aws 映像,請通過 ssh 進入您的構建代理節點並使用 /etc/sysconfig/docker 文件啟用 tcp 端口

添加-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啟動守護進程

最后,您需要使用雲節點配置中配置的 DOCKER_HOST 環境變量告訴 Jenkins 默認使用 tcp。 請注意,這不是 Jenkins 管道環境中的配置。

導航到 Jenkins -> 管理 Jenkins -> 管理雲和節點 -> 一些配置 -> 節點屬性 -> 環境變量

然后添加您的 DOCKER_HOST 環境變量。 在此處輸入圖像描述

注意:我通過 ssh 使用 Launch 代理來完成這項工作。

也許你應該從一開始就使用選項“-u root”運行 docker

至少這解決了我的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM