拒绝访问位于 unix:///var/run/docker.sock 的 Docker 守护进程套接字的权限。
拒绝访问位于 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命令?
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上找到更多信息。
问题: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标志,它使他避免了进行一些等效的操作的麻烦。