拒绝访问位于 unix:///var/run/docker.sock 的 Docker 守护进程套接字的权限。

16 浏览
0 Comments

拒绝访问位于 unix:///var/run/docker.sock 的 Docker 守护进程套接字的权限。

我有这个Dockerfile:

FROM chekote/gulp:latest

USER root

RUN apt-get update \

&& apt-get upgrade -y \

&& apt-get install -y sudo libltdl-dev

ARG dockerUser='my-user-name';

ARG group='docker';

# 如果组不存在,则创建组

RUN if ! grep -q -E "^$group:" /etc/group; then groupadd $group; fi

# 如果用户不存在,则创建用户

RUN if ! grep -q -E "^$dockerUser:" /etc/passwd; then useradd -c 'Docker image creator' -m -s '/bin/bash' -g $group $dockerUser; fi

# 将用户添加到组中(如果组已存在并且在上一行未创建)

RUN usermod -a -G ${group} ${dockerUser}

# 设置容器的默认用户

USER ${dockerUser}

我是这样构建的:

docker build --tag my-gulp:latest .

最后通过以下方式运行:

#!/bin/bash

image="my-gulp:latest";

workDir='/home/gulp/project';

docker run -it --rm \

-v $(pwd):${workDir} \

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

-v /usr/bin/docker:/usr/bin/docker \

${image} /bin/bash

这样可以正确登录到Docker容器,但是当我想查看镜像时:

docker images

或者尝试拉取镜像:

docker pull hello-world:latest

我遇到了以下错误:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/json: dial unix /var/run/docker.sock: connect: permission denied

如何创建能够在chekote/gulp:latest中使用Docker且不出错的Docker镜像?

或者错误是因为错误的docker run命令?

0
0 Comments

原因:权限被拒绝是因为docker守护程序无法访问/var/run/docker.sock套接字文件。

解决方法:通过修改/var/run/docker.sock文件的权限来解决问题。在终端中输入以下命令:

sudo chmod 666 /var/run/docker.sock

请告诉我结果...

谢谢Rakhade,这对我很有帮助

最简单的答案。

最好和最简单的解决方法!!

很抱歉,但这个答案太糟糕了。它将docker套接字的写权限开放给任何人。我只会在我的本地开发机上使用这个方法 - 即使是这样,这也是一个糟糕的做法。如果镜像除了本地环境外还应该在其他地方工作,应该尽量避免这种做法。

0
0 Comments

Permission denied to Docker daemon socket at unix:///var/run/docker.sock这个问题的出现的原因是没有权限访问Docker守护程序套接字。解决方法可以通过以下步骤来实现:

1. 将用户添加到docker组中:

sudo gpasswd -a $USER docker

2. 设置适当的权限:

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

完成以上步骤后,应该可以成功访问Docker守护程序套接字。

Docker文档也详细说明了这个问题的解决方法,可以在docs.docker.com/engine/install/linux-postinstall上找到更多信息。

0
0 Comments

问题:Permission denied to Docker daemon socket at unix:///var/run/docker.sock

原因:Docker守护进程套接字文件的权限匹配仅基于数字用户ID和组ID。如果套接字文件的模式为0660,由用户ID 0和组ID 32拥有,并且您使用用户ID 1000和组ID 1000和16调用它,那么无论一个/etc/group文件将gid 32命名为docker,另一个将gid 16命名为相同的名称,都没有关系。数字gid是不同的,您无法访问该文件。此外,由于Docker组的实际数字gid在不同系统上会有所变化,因此这不是您可以在Dockerfile中编码的内容。

解决方法:如果以root用户身份运行,即使权限不匹配,许多Docker镜像也可以访问绑定挂载的Docker套接字文件。如果以非root用户身份运行,可以使用docker run --group-add选项将一个(数字)gid添加到有效用户身份;它不必在/etc/groups文件中具体提到。在Linux主机上,可以运行以下命令:

docker run --group-add $(stat -c '%g' /var/run/docker.sock) ...

通常不会在Dockerfile中安装sudo(它对于非交互式程序效果不佳,由于容器的瞬时性质,通常不会在交互式shell中执行大量操作,您始终可以使用docker exec -u 0获取root shell),但安装一些非root用户通常被认为是最佳实践。您可以简化Dockerfile如下:

FROM node:8

RUN apt-get update

# Trying to use the host's `docker` binary may not work well

RUN apt-get install -y docker.io

# Install the single node tool you need

RUN npm install -g gulp

# Get your non-root user

RUN adduser myusername

# Normal Dockerfile bits

WORKDIR ...

COPY ...

RUN gulp

USER myusername

CMD ["npm", "run", "start"]

(该Docker基础镜像有一些与Docker最佳实践不太匹配的东西,并且似乎没有定期更新;我只会使用标准的node镜像作为基础,在其上添加所需的一个构建工具。)

主人补充问题:“Trying to use the hosts docker binary may not work well”的解释是什么?我在许多地方挂载docker二进制文件以避免安装docker。

回答:主机是MacOS,但容器是Linux,因此主机的docker二进制文件将无法运行。主机和容器都是Linux,但共享库依赖关系不同。Docker镜像的一个关键目标是完全自包含,从主机注入二进制文件或代码违反了这一规则。

主人继续追问:我同意您关于注入二进制文件不好的观点。在Docker的情况下,我在容器之外使用Docker(DooS),并且当我将MacOS的docker二进制文件挂载到Linux容器时,它可以正常工作。我相信,如果主机是Windows,则可能无法工作。但是,您是否认为在Linux容器上挂载MacOS的docker二进制文件有任何问题?这有助于避免在容器镜像中安装docker。

回答:MacOS的二进制文件无法在Linux环境中运行。依赖于从主机注入代码的镜像将不具备可移植性,这违背了使用Docker的初衷。

主人感谢回答,并表示非常感谢group-add标志,它使他避免了进行一些等效的操作的麻烦。

0