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

我该如何解决这个问题?


当前回答

在我的例子中,是进程本身(CI服务器代理)试图运行一个docker命令,但无法运行它,但当我试图从同一个用户中运行相同的命令时,它工作了。

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

之前命令在代理内部无法工作的原因是因为代理在我安装docker并授予docker组权限之前正在运行,代理进程使用缓存的旧权限并且正在失败。重新启动进程将丢弃缓存,使事情得以解决。

其他回答

如果创建一个docker组并将你的用户添加到其中不起作用(最好的解决方案,在前面的回答中描述过),那么这个是第二好的选择:

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

它所做的是改变docker的所有权。Sock文件到您的用户。

注意:使用chmod 666是一个非常糟糕的做法,因为它给了几乎所有人访问和修改docker的权限。袜子文件。

这对我来说很有用:

进入容器内部并修改文件的ACL

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

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

安装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

我尝试了这个推荐与sudo推荐,它是可以的。Sudo docker pull hello-world或Sudo docker run hello-world

Ubuntu 21.04 systemd套接字所有权

让我先说明一下,这是一个非常适合我在本地开发期间的解决方案,我在这里搜索ubuntu docker权限错误,所以我就把这个留在这里。

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