ChatGPT解决这个技术问题 Extra ChatGPT

如何修复 docker:获得权限被拒绝问题

我在我有 Ubuntu 操作系统的机器上安装了 Docker。当我运行时:

sudo docker run hello-world

一切正常,但我想隐藏 sudo 命令以使命令更短。
如果我编写的命令没有 sudo

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.35/containers/create: dial unix /var/run/docker.sock: connect: permission denied. See 'docker run --help'.

当我尝试运行时也会发生同样的情况:

docker-compose up

我该如何解决这个问题?


M
Muhammad Faizan Fareed

如果要以非 root 用户身份运行 docker,则需要将其添加到 docker 组。

如果 docker 组不存在,则创建它

$ sudo groupadd docker

将您的用户添加到 docker 组。

$ sudo usermod -aG docker $USER

运行以下命令或注销并再次登录并运行(这不起作用,您可能需要先重新启动计算机)

$ newgrp docker

检查docker是否可以在没有root的情况下运行

$ docker run hello-world

如果仍然出现错误,请重新启动

$ reboot

警告

docker 组授予与 root 用户等效的权限。有关这如何影响系统安全性的详细信息,请参阅 Docker Daemon Attack Surface..

取自 docker 官方文档:manage-docker-as-a-non-root-user


执行完所有三个步骤后我仍然有这个问题“(
我必须在 Ubuntu 18 上重新启动它才能工作——简单地注销并重新登录是行不通的。
@heez 可能不需要重新启动,重新启动 docker 对我来说就足够了。 sudo systemctl restart docker
请注意,在 docker 组中基本上授予 root 访问权限,而不强制执行常规 sudo 策略和审计。有关详细信息和讨论,请参阅 GitHub issue #9976
重新启动docker对我不起作用,只有重新启动(Ubuntu 18.04)
G
Galigator

升级后,我的权限被拒绝。执行 'mkb' post install steps 的步骤没有任何改变,因为我的用户已经在 'docker' 组中;我以任何方式重试了两次,但均未成功。

经过一个小时的搜索,以下解决方案终于奏效了:

sudo chmod 666 /var/run/docker.sock

解决方案来自 Olshansk

看起来升级在没有足够权限的情况下重新创建了 'docker' 组的套接字。

问题

这个硬 chmod 打开了安全漏洞,每次重启后,这个错误一次又一次地开始,你每次都必须重新执行上述命令。我想要一个一劳永逸的解决方案。为此,您有两个问题:

1) SystemD 的问题:套接字将仅使用所有者“root”和组“root”创建。您可以使用以下命令检查第一个问题: ls -l /lib/systemd/system/docker.socket 如果一切正常,您应该看到“root/docker”而不是“root/root”。

2)图形登录问题:https://superuser.com/questions/1348196/why-my-linux-account-only-belongs-to-one-group 您可以使用以下命令检查第二个问题:groups 如果一切正常正确,您应该在列表中看到 docker 组。如果没有尝试命令 sudo su $USER -c groups 如果你看到那么 docker group 那是因为错误。

解决方案

如果您设法获得图形登录的解决方法,这应该可以完成工作:

sudo chgrp docker /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket

但是如果你不能管理这个错误,一个不错的解决方案可能是这样的:

sudo chgrp $USER /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket

这是因为您处于图形环境中,并且可能是您计算机上的唯一用户。在这两种情况下,您都需要重新启动(或 sudo chmod 666 /var/run/docker.sock


如果 docker 是按照 docs.docker.com/install 上的文档安装的,那么您永远不需要处理任何此类命令
@Scott Stensland 我已经“按照文档”多次安装 docker。我认为问题来自与另一个身份不明的包裹的不良互动。
在 docker-in-docker 中,我错误地从主机安装 /var/run/docker.sock,而最后没有 :ro ......只要我补充说我很高兴
我在 EC2 - AWS 上使用 ubuntu 18 并且运行良好。所有其他(sudo usermod -aG docker $ USER 和其他东西)都不起作用
谢谢,它已在 Ubuntu 18.04 LTS 中修复。重述和添加到地面没有
J
Jader Martins

添加泊坞窗组

$ sudo groupadd docker

将当前用户添加到 docker 组

$ sudo usermod -aG docker $USER

将会话切换到 docker 组

$ newgrp - docker

运行一个例子来测试

$ docker run hello-world

newgrp 命令提示输入密码,但不接受我的用户密码。相反,su - $USER 努力避免注销/登录。
0
0x3bfc

将当前用户添加到 docker 组

sudo usermod -aG docker $USER

更改 docker socket 的权限以能够连接到 docker daemon /var/run/docker.sock

sudo chmod 666 /var/run/docker.sock

您的解决方案适用于该问题:获取权限被拒绝,谢谢
这个解决方案对我有用 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.40/containers/create:拨打 unix /var/run/docker.sock:connect:权限被拒绝。
N
Nicolás Alarcón Rapela

我用以下命令解决了这个错误:

$ sudo chmod 666 /var/run/docker.sock

我正在使用 ubuntu 18.04 lts 服务器,我使用了这个命令,重新启动,但仍然出现错误:(
每次启动机器时,您总是需要再次运行它,如果您希望它在启动时自动运行,请按照以下步骤操作:stackoverflow.com/a/69269302/14043328
A
Asclepius

它只需要更改 sock 文件的权限。

sudo chmod 666 /var/run/docker.sock

这肯定会奏效。


这将打开一个安全漏洞,并且需要在每次重新启动后重做。
P
Pranav Bhendawade

您可以随时尝试 https://docs.docker.com/install/linux/linux-postinstall/ 文档中的 Manage Docker as a non-root user 段落。

这样做之后,如果问题仍然存在,那么您可以运行以下命令来解决它:

sudo chmod 666 /var/run/docker.sock

使 docker 套接字对每个人(使用 chmod 666)都可读或可写是一场安全灾难......永远不建议这样做。
@AaylaSecura 感谢您提醒我们,但您能否简要解释一下为什么可读或可写套接字是灾难?
任何可以与 docker 套接字对话的人实际上都是主机系统上的 root!请参阅以下示例:fosterelli.co/privilege-escalation-via-docker 以及有关 docker 权限提升的许多其他资源。使套接字世界可写有效地赋予所有 UNIX 用户 root 权限。
不要分配 666 权限。 660640 应该绰绰有余。
M
Md. Shahariar Hossen

修复 Docker 问题:(权限被拒绝)

如果 docker 组不存在,则创建它:sudo groupadd docker

查看可用系统中的超级用户数: grep -Po '^sudo.+:\K.*$' /etc/group

在 linux 命令 shell 中导出用户:export USER=demoUser

将用户添加到 docker 组:sudo usermod -aG docker $USER

运行以下命令/登录或注销:newgrp docker

检查 docker 是否运行正常: docker run hello-world

如果仍然出现错误,请重新启动:reboot

如果它不起作用,请运行以下命令:

sudo chmod 660 /var/run/docker.sock


不应盲目使用777
@Akshay Hedge 为什么?我使用了 777 选项,它起作用了😅
@PurushothamanSrikanth 777 意味着任何人都可以对这些文件做任何事情
不要使用 777!使用 660640
660 不起作用。对我来说,它是默认设置的。
Q
Qinsheng Zhang

尝试在 unix:///var/run/docker.sock 连接到 Docker 守护程序套接字时获得权限被拒绝:获取 http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json:拨打 unix /var/run/docker.sock:连接:权限被拒绝

sudo chmod 666 /var/run/docker.sock

这解决了我的问题。


a
aran

我们总是忘记 ACLs 。请参阅setfacl

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


如果它抱怨没有找到 facl,请使用 sudo apt install acl 安装
我收到“setfacl: Option -m: Invalid argument near character 6”这个错误。
.sock 是一个套接字文件,这些是临时文件,您每次都必须运行相同的命令。在父文件夹中设置默认值是可行的,但这是 /var/run,我们不希望非特权用户对 /var/run 中的每个文件都有 rw 访问权限。
A
Asclepius

为了解决这个问题,我搜索了我的 docker 和 docker-compose 安装在哪里。在我的例子中,docker 安装在 /usr/bin/docker 中,而 docker-compose 安装在 /usr/local/bin/docker-compose 路径中。然后,我在终端中写下这个:

到码头工人:

sudo chmod +x /usr/bin/docker

docker-compose

sudo chmod +x /usr/local/bin/docker-compose

现在我不需要在我的命令中写 docker 单词 sudo

/************************************************* ************************/

勘误表:

@mkasberg 评论了这个问题的最佳解决方案。我引用评论:

That might work, you might run into issues down the road. Also, it's a security vulnerability. You'd be better off just adding yourself to the docker group, as the docs say. sudo groupadd docker, sudo usermod -aG docker $USER. Docs: https://docs.docker.com/install/linux/linux-postinstall/


这可能会奏效,您可能会遇到问题。此外,这是一个安全漏洞。正如文档所说,您最好将自己添加到 docker 组中。 sudo groupadd dockersudo usermod -aG docker $USER
嘿@mkasberg!谢谢你的评论!我做了一个勘误表来引用你的解决方案。非常感谢!
C
Cactus Mamelut

认真的家伙。不要在你的组中添加 Docker 或修改套接字 posix(没有强化 SELinux),这是一种创建 root privesc 的简单方法。只需在 .bashrc 中添加一个别名,这样更简单、更安全: alias dc='sudo docker'。


也许您可以谈论:podman.io。但是以 root 运行似乎是开发人员的用例。
j
jmunsch

ubuntu 21.04 systemd 套接字所有权

让我先说一句,这对我来说是在本地开发过程中非常合适的解决方案,我来这里是为了寻找 ubuntu docker permission error,所以我就把它留在这里。

我不拥有 unix 套接字,所以我把它弄丢了。

sudo chown $(whoami):$(whoami) /var/run/docker.sock

另一个更持久的开发环境解决方案是修改 unix 套接字创建的用户所有权。这将为您的用户提供所有权,因此它将在重新启动之间保持:

sudo nano /etc/systemd/system/sockets.target.wants/docker.socket

docker.socket:

[Unit]
Description=Docker Socket for the API

[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=YOUR_USERNAME_HERE
SocketGroup=docker

[Install]
WantedBy=sockets.target

与其他所有解决方案完全不同的解决方案。
不起作用,即使在 sudo systemctl restart docker 之后也是如此。
T
TechJ

重新启动机器对我有用。

$ reboot

L
Leo Rocca

这对我有用:

进入容器并修改文件的 ACL

sudo usermod -aG docker $USER
sudo setfacl --modify user:$USER:rw /var/run/docker.sock

这是比使用 chmod 更好的解决方案。


.sock 文件是套接字文件,本质上是临时的。每次 docker 启动时,您都必须设置此项。
H
Herbert

lightdm 和 kwallet 附带了一个似乎在登录时没有通过补充组的错误。为了解决这个问题,除了 sudo usermod -aG docker $USER,我还必须注释掉

auth optional pam_kwallet.so
auth optional pam_kwallet5.so

#auth optional pam_kwallet.so
#auth optional pam_kwallet5.so

/etc/pam.d/lightdm 重新启动之前,让 docker-group 真正生效。

错误:https://bugs.launchpad.net/lightdm/+bug/1781418,此处:https://bugzilla.redhat.com/show_bug.cgi?id=1581495


S
Sheetala Prasad Tiwari

使用这个命令

sudo usermod -aG docker $USER

然后重新启动您的计算机,这对我有用。


A
Ahmed Mahmoud

您可以按照以下步骤操作,这对您有用:

创建一个 docker 组 sudo groupadd docker 将您的用户添加到该组 sudo usermod -aG docker $USER 列出组以确保通过运行此命令成功创建 docker 组 groups 运行以下命令也可以更改 docker group newgrp docker 的会话更改文件 docker.socksudo chown root:docker /var/run/docker.sock 的组所有权 更改 .docker 目录的所有权 sudo chown "$USER":"$USER" /home/"$USER"/.docker - R 最后 sudo chmod g+rwx "$HOME/.docker" -R

在该测试之后,您可以运行 docker ps -a


我想要一个不需要重新启动的答案。这是提供这一点的唯一答案。 “诀窍”是chown docker.sock 文件。
z
zanko

我用 sudo 推荐来尝试这个推荐,没问题。sudo docker pull hello-worldsudo docker run hello-world


M
Mostafa Wael

最直接的解决方案是键入

sudo chmod 666 /var/run/docker.sock 每次启动机器时。但是,这种方法会破坏任何可能存在的系统安全性,并向所有人开放 Docker 套接字。如果您可以接受 - 例如:您机器的唯一用户 - 然后使用它。

不过,每次启动机器时都需要它,您可以通过添加使其在启动时运行

start on startup
task
exec chmod 666 /var/run/docker.sock

/etc/init/docker-chmod.conf 文件。


666 是权限过多。 660640 应该绰绰有余
S
Sathiamoorthy

在 Linux 环境中,安装 dockerdocker-compose 后需要重新启动才能更好地工作 docker 以避免此问题。

$ sudo systemctl restart docker

刚刚在 Ubuntu 上安装了 docker。重新启动并没有解决“权限被拒绝”。
S
Srikant Patra

在 Centos 上安装 Docker 之后。在以下命令下运行时,出现以下错误。

[centos@aiops-dev-cassandra3 ~]$ 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.soc k/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

更改 docker.socket 的组和权限

[centos@aiops-dev-cassandra3 ~]$ ls -l /lib/systemd/system/docker.socket
-rw-r--r--. 1 root root 197 Nov 13 07:25 /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chgrp docker /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chmod 666 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$ ls -lrth /var/run/docker.sock
srw-rw-rw-. 1 root docker 0 Nov 20 11:59 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$

使用以下 docker 命令进行验证

[centos@aiops-dev-cassandra3 ~]$ 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/

[centos@aiops-dev-cassandra3 ~]$

L
Leopold Cat

安装 docker 后,创建 'docker' 组并向其中添加用户,编辑 docker 服务单元文件:

sudo nano /usr/lib/systemd/system/docker.service

在 [Service] 部分添加两行:

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock

保存文件(Ctrl-X、y、Enter)

运行并启用 Docker 服务:

sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker

d
ddaniel91

我也遇到了类似的问题,但是我想创建的容器需要将 /var/run/docker.sock 作为一个卷(Portainer Agent)挂载,同时在不同的命名空间下运行它。通常一个容器不关心它是从哪个命名空间开始的——这就是重点——但由于访问是从不同的命名空间进行的,所以必须避免这种情况。

--userns=host 添加到容器的运行命令使其能够使用获得正确的权限。

相当具体的用例,但是经过比我想承认的更多的研究时间,我只是认为如果其他人最终陷入这种情况,我应该与世界分享它:)


D
Damir

绝对不是问题所在,但由于它是谷歌搜索错误消息时的第一个搜索结果,我将把它留在这里。

首先,使用以下命令检查 docker 服务是否正在运行:

systemctl status docker.service

如果它没有运行,请尝试启动它:

sudo systemctl start docker.service

...并再次检查状态:

systemctl status docker.service

如果尚未启动,请调查原因。可能,您修改了配置文件并出错(就像我在修改 /etc/docker/daemon.json 时所做的那样)


d
deeps

Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字由用户 root 拥有,其他用户只能使用 sudo 访问它。 Docker 守护程序始终以 root 用户身份运行。

如果您不想在 docker 命令前加上 sudo,请创建一个名为 docker 的 Unix 组并将用户添加到其中。当 Docker 守护进程启动时,它会创建一个可供 docker 组成员访问的 Unix 套接字。

要创建 docker 组并添加您的用户:

创建 docker 组 sudo groupadd docker 将您的用户添加到 docker 组 sudo usermod -aG docker $USER 注销并重新登录,以便重新评估您的组成员身份。如果在虚拟机上进行测试,可能需要重新启动虚拟机才能使更改生效。在桌面 Linux 环境(例如 X Windows)上,完全注销会话,然后重新登录。在 Linux 上,您还可以运行以下命令来激活对组的更改: newgrp docker 验证您是否可以在不使用 sudo 的情况下运行 docker 命令.下面的命令下载一个测试图像并在容器中运行它。当容器运行时,它会打印一条信息性消息并退出 docker run hello-world

如果您在将用户添加到 docker 组之前最初使用 sudo 运行 Docker CLI 命令,您可能会看到以下错误,这表明您的 ~/.docker/ 目录是由于 sudo 命令而使用不正确的权限创建的。

   WARNING: Error loading config file: /home/user/.docker/config.json -
   stat /home/user/.docker/config.json: permission denied

要解决此问题,请删除 ~/.docker/ 目录(它会自动重新创建,但所有自定义设置都会丢失),或者使用以下命令更改其所有权和权限:

sudo chown "$USER":"$USER" /home/"$USER"/.docker -R

sudo chmod g+rwx "$HOME/.docker" -R

可以在此处找到 docker 在 linux 上的所有其他安装后步骤https://docs.docker.com/engine/install/linux-postinstall/


u
user18558102

我尝试了所有描述的方法,但没有任何帮助解决问题。解决方案是在运行 selenoid 和 selenoid-ui 时使用 --use-drivers 参数。下面是我的 Dockerfile 的完整列表。

FROM selenoid/chrome
USER root
RUN apt-get update
RUN apt-get -y install docker.io
RUN curl -s https://aerokube.com/cm/bash | bash
RUN ./cm selenoid start --vnc --use-drivers
RUN ./cm selenoid-ui start --use-drivers
EXPOSE 4444 8080
CMD ["-conf", "/etc/selenoid/browsers.json", "-video-output-dir", "/opt/selenoid/video/"]

I
Igor B

在我的情况下,尝试运行 docker 命令的进程本身(CI 服务器代理)无法运行它,但是当我尝试从同一用户中运行相同的命令时,它可以工作。

重新启动运行 CI 服务器代理的守护程序解决了该问题。

之前命令在代理内部不起作用的原因是因为代理在我安装 docker 并授予 docker 组权限之前正在运行,并且代理进程使用缓存的旧权限并且失败了。重新启动进程会删除缓存并使事情顺利进行。


M
Mohit Rakhade

只需打开终端并输入此命令

sudo chmod 666 /var/run/docker.sock

这会破坏任何可能存在的系统安全性,并向所有人开放 Docker 套接字。
j
jyoti prakash sahoo

sudo chmod 666 /var/run/docker.sock

这在我登录 docker 时遇到错误时对我有所帮助但现在这在我的系统中完全可以正常工作。


使用这种方法非常不安全。查看在主要问题的评论中提供的安装后说明。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅