码头工人,拒绝袜子许可

当我尝试运行简单的 docker 命令时,比如:

$ docker ps -a

我收到一条错误消息:

拒绝授权.../var/run/docker.sock: connect: 拒绝授权

检查权限时

$ ls -al /var/run/

我看到这句话:

srw-rw---- root docker docker.sock

因此,我遵循许多论坛的建议,将本地用户添加到 docker 组:

$ sudo usermod -aG docker $USER

但它没有帮助。我仍然得到非常相同的错误消息。我如何修复它?

153949 次浏览

正如前面评论中提到的,在您重新登录之前,这些更改不会适用。如果您正在执行 SSH 并打开一个新终端,那么它将在新终端中工作

但是因为您使用了 GUI 并打开了新的终端,所以没有应用更改。这就是错误没有消失的原因

所以下面的命令做了它的工作,它只是一个重新登录被错过

sudo usermod -aG docker $USER

对于那些刚接触 shell 的人,命令是:

$ sudo usermod -aG docker $USER

需要在 shell 中定义 $USER。默认情况下,这通常是存在的,但是您可能需要在一些 shell 中将这个值设置为您的登录 ID。


更改用户的组不会更改用户打开的现有登录名、终端和 shell。为了避免再次登录,您可以简单地运行:

$ newgrp docker

访问当前 shell 中的组。


完成此操作后,用户实际上可以在服务器上进行 root 访问,因此只能对具有不受限制的 sudo 访问权限的受信任用户进行此操作。

因为我的用户是 AD 用户,所以我必须通过手动编辑/etc/group 文件将 AD 用户添加到本地组中。不幸的是,adduser 命令似乎不能识别 nsswitch,并且在将某人添加到组时不能识别未在本地定义的用户。

然后重新启动或刷新/etc/group。

问候。

  1. 确保设置了 $USER变量

    $ echo $USER
    
    
    $ sudo usermod -aG docker $USER
    
  2. logout

  3. Upon login, restart the docker service

    $ sudo systemctl restart docker
    
    
    $ docker ps
    

原因: 错误消息意味着当前用户无法访问 docker 引擎,因为用户没有足够的权限访问 UNIX 套接字以与引擎通信。

快速解决方案:

  1. 使用 sudo 以 root 身份运行命令。

    sudo docker ps
    
  2. Change the permissions of /var/run/docker.sock for the current user.

    sudo chown $USER /var/run/docker.sock
    

Caution: Running sudo chmod 777 /var/run/docker.sock will solve your problem but it will open the docker socket for everyone which is a security vulnerability as pointed out by @AaylaSecura. Hence it shouldn't be used, except for testing purposes on the local system.

Permanent Solution:

Add the current user to the docker group.

sudo usermod -a -G docker $USER

注意: 您必须注销并再次登录才能使更改生效。

请参考此 博客,以了解有关以非根用户身份管理 Docker 的更多信息。

以 root 用户的身份 bash 到容器中 docker exec -it --user root <dc5> bash

如果尚未创建,则创建 docker 组 groupadd -g 999 docker

将用户添加到 Docker 组 usermod -aG docker jenkins

更改权限 chmod 777 /var/run/docker.sock

您需要以非 root 用户的身份管理 docker。 创建 docker 组并添加用户:

  1. 创建 docker 组。

    $ sudo groupadd docker

  2. 将用户添加到 docker 组。

    $ sudo usermod -aG docker $USER

  3. 注销并重新登录,以便重新计算组成员资格。

如果在虚拟机上进行测试,则可能需要重新启动虚拟机才能使更改生效。

在桌面 Linux 环境(如 X Windows)中,完全注销会话,然后再重新登录。

在 Linux 上,您还可以运行以下命令来激活对组的更改:

$ newgrp docker

  1. 验证是否可以在不使用 sudo 的情况下运行 docker 命令。

    $ docker run hello-world

当我尝试运行简单的 docker 命令时,如: $ docker ps -a

我得到一个错误消息: Got permission denied ... /var/run/docker.sock: connect: permission denied

我该怎么补救呢?

TL; DR: 有两种方法(第一种方法,也在问题本身中提到,被其他答案广泛地解决了,但是 会带来安全隐患; 所以我将详细阐述这个问题,并开发第二种解决方案,也可以适用于这个相当合理的用例)。


回想一下上下文,Docker 守护套接字属于 root:docker:

$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 janv. 28 14:23 /var/run/docker.sock

因此,在这个默认设置中,需要通过 sudo预置所有 docker CLI 命令。

为了避免这种情况,人们可以:

  1. 将自己的用户帐户($USER)添加到 docker组——但是在个人工作站上这样做风险很大,因为这相当于 为用户运行的所有程序提供 root 权限,而不需要任何 sudo密码提示或审核

    参见:

  2. 人们可以不用手动输入 sudo docker而自动预先输入 sudo: 为了达到这个目的,一个解决方案包含在 ~/.bashrc中添加以下别名中(详见例如 这根线) :

    __docker() {
    if [[ "${BASH_SOURCE[*]}" =~ "bash-completion" ]]; then
    docker "$@"
    else
    sudo docker "$@"
    fi
    }
    alias docker=__docker
    

    然后人们可以打开一个新的终端并输入:

    docker run --pul〈TAB〉 # → docker run --pull
    # autocompletion works
    docker run --pull always --rm -it debian:11  # ask one's password
    \docker run --help  # bypass the alias (thanks to the \) and ask no password
    

您必须使用 pns 执行器而不是 docker。 运行以下修改配置图的补丁,就可以了。

kubectl -n argo patch cm workflow-controller-configmap -p '{"data": {"containerRuntimeExecutor": "pns"}}' ;

档号: https://www.youtube.com/watch?v=XySJb-WmL3Q&list=PLGHfqDpnXFXLHfeapfvtt9URtUF1geuBo&index=2&t=3996s

* * * 关于这些答案的重要注意事项: docker 组并不总是“ docker”,有时它是“ dockerroot”,例如 Centos 7安装的情况

sudo yum install -y docker

在安装 Docker 之后,您应该做的第一件事是

sudo tail /etc/group

上面应该写

......
sshd:x:74:
postdrop:x:90:
postfix:x:89:
yourusername:x:1000:yourusername
cgred:x:996:
dockerroot:x:995:

在本例中,它是“ dockerroot”而不是“ docker”,

sudo usermod -aG dockerroot yourusername
logout

输入命令并在没有 sudo 命令的情况下浏览 docker

sudo chmod 666 /var/run/docker.sock

在以下命令的帮助下,我能够在不使用 sudo 的情况下执行 docker 命令

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