Docker:尝试在 unix:///var/run/docker.sock 连接到 Docker 守护程序套接字时获得权限被拒绝

Posted

技术标签:

【中文标题】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 【发布时间】:2018-05-30 23:16:09 【问题描述】:

我是 docker 新手。我只是尝试在我的本地机器(Ubuntu 16.04)中使用 docker 和 Jenkins。

我使用以下管道脚本配置了一个新作业。

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

但它失败并出现以下错误。

【问题讨论】:

它是单片 Jenkins 还是主从设置?检查您正在执行 docker inspect 命令的用户。查看 /var/run/docker.sock 是否具有对组的 RW 访问权限。 Got permission denied while trying to connect to the Docker daemon socket while executing docker stop的可能重复 docker 安装后步骤:docs.docker.com/install/linux/linux-postinstall/… 我遇到了类似的问题。这些资源很有帮助:linuxhandbook.com/docker-permission-denied 和 techoverflow.net/2018/12/15/… 【参考方案1】:

用户jenkins需要加入群组docker

sudo usermod -a -G docker jenkins

然后重启 Jenkins。

编辑

如果您因为收到来自 docker 的此消息而遇到堆栈溢出问题,但您没有使用 jenkins,则很可能错误是相同的:您的非特权用户不属于 docker 组。

你可以这样做:

sudo usermod -a -G docker [user]

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

您可以通过grep docker /etc/group 来检查它是否成功,并看到如下内容:

docker:x:998:[user]

在其中一行中。

然后将您的用户组 ID 更改为docker

newgrp docker

最后注销再登录

【讨论】:

并重新登录用户 不错的答案,但更笼统地说,我们可以这样做:sudo usermod -a -G docker $USER 并注销或重新启动。 link 我必须重新启动我的服务器才能真正工作。 我必须断开/重新连接我的节点才能正常工作(它们通过 ssh 连接) 无需再次登录,只需在同一终端会话中使用newgrp docker即可。【参考方案2】:

我的第一个解决方案是:

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

但它们都不适合我,我试过了:

chmod 777 /var/run/docker.sock

这行得通,但我不知道这是否是正确的选择。

【讨论】:

它失败的原因可能是因为您必须重新打开终端。执行 664 后它失败了,但后来我打开了一个它工作的新 shell。 我尝试重新打开,但它在最后一个 chmod 777 之后才开始工作 问题是重启后 777 被重置为 660。对我来说解决问题的是“usermod -aG users jenkins”。 我意识到它已被重置,但不要将 docker.sock 权限设置为 777。这会给您系统上的任何人提供 root 权限。他们能够与 docker 交谈并不受限制地创建特权容器。 尽管这对作者甚至对我都有效,但更多地访问docker.sock 文件并不是最好的解决方案,您只需要执行usermod ... 指令,然后重启系统,否则不生效【参考方案3】:

我的成功

sudo usermod -a -G docker $USER
reboot

【讨论】:

无需重启。只需注销然后再次登录。我说的是用户模式 在 Ubuntu 18.04 上,我必须重新启动才能使设置生效。 在 Ubuntu 20.04 上,我需要重新启动。关闭会话还不够。 或者运行 su $USER 而不是注销 我在这里和其他地方尝试了许多建议,重启似乎就成功了。【参考方案4】:

2018-08-19

我在这个问题上被困了好几天,因为我还没有找到完整的答案,原因和方法,我会为其他遇到同样问题的人发布一个,上面的答案不起作用。

这些是在 docker 中运行 Jenkins 的 3 个关键步骤:

    您将套接字 /var/run/docker.sock 安装到 jenkins 容器,以便能够从主机使用 docker。 您必须在容器内安装 docker 才能使用它。 This 是一篇关于如何做到这一点的伟大而简单的文章。请注意,较新的版本可能已经安装了 docker 您运行 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 在你的机器上

希望对你有帮助

【讨论】:

谢谢——请注意,对于当前的 Jenkins Docker 映像,docker 命令已经安装(而 apt-get 没有。)您的其他要点——将 Jenkins 添加到正确的组并确保 GID 匹配来自 Docker 主机的那个,保持原样。 用组 ID 问题挽救了我的生命。谢谢! 当我尝试在 jenkins 容器中添加组时,它失败了,因为我需要成为 root。如果我尝试su -,它会要求我输入密码。您如何在 jenkins 容器中添加具有正确 ID 的组? 容器中的默认用户由父映像用户确定,但如果您运行标准的ubuntu 映像,它应该是 root 并且运行 usermod 命令应该没有任何问题.它究竟是如何失败的?你能提供示例命令和错误消息吗? 这应该是对一个单独的问题的单独回答,该问题询问相同的问题,但在容器内运行 Jenkins 时。 groupmod 命令可以/应该在 Dockerfile 中。【参考方案5】:

更改docker.sock文件的访问权限

chmod 777 /var/run/docker.sock

或者你可以在命令的开头使用sudo

chmod 777 将允许所有用户执行所有操作,而chmod 666 将允许所有用户读写但不能执行文件。

【讨论】:

chmod 777 /var/run/docker.sock 为我工作我从 snap 安装后遇到了这个问题 这是最佳做法吗? 出于安全原因,这绝对不是最佳选择,但对我有用。 当然可以,因为它让每个人都可以访问。最佳做法是创建一个名为 docker 的组,然后创建一个 sudo chown root:docker /var/run/docker.sock 以便 docker 组中的用户可以访问。【参考方案6】:

我将 jenkins 用户添加到 root 组并重新启动 jenkins 并开始工作。

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

【讨论】:

这是一种糟糕的安全做法。首选方法是this answer。【参考方案7】:

方法 01 :- 更安全的方法

sudo usermod -aG docker $USER

要应用新的组成员资格,请退出服务器并重新登录,或键入以下内容:

su - $USER

系统将提示您输入用户密码以继续。 通过键入以下内容确认您的用户现在已添加到 docker 组:

id -nG

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

chmod 777 /var/run/docker.sock

【讨论】:

这是我唯一可行的解​​决方案! 否则你可以用 sudo 运行它 这个解决方案会让 docker 不安全!! 不推荐用于公共部署。 我不知道如何注销系统用户,所以,我重新启动了 Jenkins 服务。服务詹金斯重启【参考方案8】:

这适用于我在 Ubuntu 20.04

sudo chmod 666 /var/run/docker.sock

不知道它到底做了什么,但解决了问题。

【讨论】:

它工作正常,但是当我再次重新启动系统时它不工作。【参考方案9】:

Simply 为jenkins 用户添加docker 作为supplementary group

sudo usermod -a -G docker jenkins

在使用 Docker 映像作为 Jenkins Agent 时并不总是足够的。也就是说,如果您的Jenkinsfilepipelineagentdockerfilepipelineagentimage 开头:

pipeline 
    agent 
        dockerfile 
            filename 'Dockerfile.jenkinsAgent'
        
    
    stages 

这是因为Jenkins执行了docker run命令,导致了三个问题。

代理将(可能)未安装 Docker 程序。 代理将无法访问 Docker 守护程序套接字,因此将尝试运行 Docker-in-Docker,即not recommended。 Jenkins 给出了代理应该使用的数字用户 ID 和数字组 ID。 Agent 不会有任何补充组,因为docker run 不会登录到容器(更像是sudo)。

为代理安装 Docker

使 Docker 程序在 Docker 映像中可用只需要在 Dockerfile 中运行 Docker installation steps:

# 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 守护进程套接字

作为has been said before,解决第二个问题意味着运行 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 时运行 useradd ... jenkinsgroupadd ... 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 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 用户的UID 和GID,并使用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

【讨论】:

这是一个出色的综合解决方案,也是唯一一个在使用通过 dockerfile 共享到 docker 的 docker 套接字时对我有用的解决方案。它应该是它自己的博客文章。谢谢! 看来你可以通过-u jenkins:$(getent group docker | cut -d: -f3) 在传递参数时,最好更改以下行:args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:docker' by args '-v /var/run/docker.sock:/var/run/docker.sock -u jenkins:jenkins --group-add docker' 当传递 -u jenkins:docker 时,您更改主用户组,这意味着当用户写入一个文件,比如说在工作区中,它将文件用户设置为 jenkins,将组设置为 docker。这可能不是我们想要的。【参考方案10】:

我遇到了类似的问题,这是一个权限问题,这个问题的原因是因为 Docker 守护程序/服务器始终以 root 用户身份运行,并且希望您始终在带有sudo的docker命令。

Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字归用户 root 所有,其他用户只能使用 sudo 访问它。

要解决此问题,以下方法对我有用:

首先,检查你是否已经创建了一个 docker 组:

cat /etc/group

如果在显示的列表中没有找到docker,则需要创建一个:

sudo groupadd docker

接下来,使用以下命令确认您的usergroup

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/

注意:请在包含应用程序目录的父目录中运行此命令。

就是这样。

我希望这会有所帮助

【讨论】:

【参考方案11】:

我让 Jenkins 在 Docker 中运行,并且连接的 Jenkins 正在使用 Docker 套接字从主机 Ubuntu 16.04 通过卷到 /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 表示 - 为组中的所有者和用户读写(但不执行)。

【讨论】:

这是唯一不需要登录/登录的解决方案,即尝试在 shell 脚本中运行时有效的解决方案。【参考方案12】:

就我而言,不仅需要将jenkins 用户添加到docker 组,还需要将该组作为jenkins 用户的主要组。

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

不要忘记重新连接 jenkins 从节点或重新启动 jenkins 服务器,具体取决于您的情况。

【讨论】:

【参考方案13】:

2019-05-26

This 为我工作!

示例 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"

【讨论】:

很方便...不需要和权限合并。【参考方案14】:

在进行生产配置时,我遇到了权限问题。我尝试了以下解决方案来解决问题。

错误信息

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

解决方法:错误信息中指出的socket的权限,/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/

【讨论】:

【参考方案15】:

第 1 步:将您的用户名添加到 docker 组:

sudo usermod -a -G docker $USER

然后注销并重新登录。

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

newgrp docker

【讨论】:

【参考方案16】:

2019-02-16

大部分步骤对我来说和其他人写的一样。 但是,我无法通过上述解决方案使用 usermod 将 jenkins 添加到组 docker。

我从 docker 主机running docker 容器 尝试了以下命令:

sudo usermod -a -G docker jenkins

(我从 docker 主机 使用以下命令进入 running 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] jenkins 的密码:

我不知道密码。

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

usermod:权限被拒绝。 usermod:无法锁定 /etc/passwd;尝试 稍后再来。

解决方案: 我使用以下命令从 docker 主机 进入 running docker 容器

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

现在,我以 root 身份进入,并发出以下命令:

usermod -a -G docker jenkins

然后,从 docker 主机,我使用以下命令重新启动了我的 正在运行的 docker 容器

docker restart my_container_id_or_name

在那之后,我开始了 jenkins 的工作,并成功完成了。

我只使用root用户为jenkins用户发出usermod命令。

【讨论】:

【参考方案17】:

如果您可能会遇到如下错误,

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的密码,不知道用户密码是什么。 我认为您应该为 Jenkins 用户授予 sudo 权限。或者您可以在 root 用户中尝试以下命令,usermod -a -G docker jenkinschown jenkins:docker /var/run/docker.sock 您不应将套接字的所有权更改为 jenkins。并且您应该以任何具有 sudo 访问权限的普通用户身份运行 sudo,而不是以 jenkins 身份运行。这个答案对接受的答案有什么作用?【参考方案18】:

我正在使用 official 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

【讨论】:

无需在 Jenkins 镜像上安装整个 docker,see my answer【参考方案19】:
sudo usermod -a -G docker jenkins
sudo service jenkins restart

【讨论】:

【参考方案20】:

我在 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

【讨论】:

【参考方案21】:

在我的情况下,这将成功。 浏览您的本地仓库并输入此命令。

sudo chmod 666 /var/run/docker.sock

【讨论】:

【参考方案22】:

如果您在 docker 容器中运行 Jenkins,并且您的 Jenkins 链接到主机 docker,那么您可以通过下面的 Dockerfile 修复该问题:

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

【讨论】:

jenkins/jenkins 图像不包含 docker 或 docker-cli。您需要安装 docker-cli 或从主机挂载它。【参考方案23】:

sudo setfacl --modify user:(用户名或ID):rw /var/run/docker.sock

我多次尝试执行命令

sudo chmod 777 /var/run/docker.sock

但不幸的是,我每次登录 ubuntu 系统时都必须这样做。 它不需要重新启动,并且比 usermod 或 chown 更安全。 当用户名只存在于容器内而不存在于宿主机上时,需要用户ID。

希望能帮到你解决问题。

【讨论】:

【参考方案24】:

在运行 Jenkins 的服务器上,我使用了

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

然后运行每个 docker 容器

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

使用 setfacl 似乎是一个更好的选择,并且不需要“-u 用户”。然后容器以运行 Jenkins 的同一用户身份运行。但如果安全专家提供任何反馈,我将不胜感激。

【讨论】:

【参考方案25】:

在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

【讨论】:

【参考方案26】:

就我而言,它只是启动 docker 服务:

sudo service docker start

【讨论】:

【参考方案27】:

如果有人在他们的本地机器(Ubuntu)上仍然面临这个问题,那么试试下面的命令:

sudo chmod 666 /var/run/docker.sock

【讨论】:

【参考方案28】:

如果您想保持简单,请在您的 Dockerfile 上使用 fixdockergid

【讨论】:

【参考方案29】:

除了将用户添加到 docker 组并尝试此线程中提到的所有内容之外,我花了一段时间才意识到我必须重新启动终端,然后重新登录到 ec2 实例。之后就成功了。

【讨论】:

【参考方案30】:

检查你的 docker 是否正在运行 sudo systemctl status docker

检查错误 docker ps -a

授予权限 sudo usermod -aG docker $USER 下一个命令 su - $USER

再次检查是否出现错误 docker ps -a

【讨论】:

这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review

以上是关于Docker:尝试在 unix:///var/run/docker.sock 连接到 Docker 守护程序套接字时获得权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Docker-3 尝试Docker 应用栈

docker-proxy - 尝试在 443 上绑定时启动用户级代理时出错

尝试从 Ruby on Rails 连接到 postgres(在 docker 容器中)

404错误:尝试在docker内部部署ocelot网关调用微服务

尝试在运行 docker-toolbox 的 Windows 上使用 docker-compose 在 docker 容器内运行 webpack-dev-server 时出现“来自服务器的空回复”

EACCES:权限被拒绝 mkdir ...尝试在节点项目中使用 docker 卷时