对位于 unix:///var/run/docker.sock 的 Docker 守护程序套接字的权限被拒绝

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

我有这个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';

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

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

# add user to the group (if it was present and not created at the line above)
 RUN usermod -a -G ${group} ${dockerUser}

# set default user that runs the container
 USER ${dockerUser}

我是这样建造的:

docker build --tag my-gulp:latest .

最后 运行 通过 script 这样:

#!/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 运行命令?

该错误与 docker pull 或 docker image 子命令无关,而是您需要以具有写入权限的用户身份调用 docker 命令docker 套接字(例如,成为 root、使用 sudo 或在 docker 组中)。

您的 docker 运行 命令需要 --privileged 标志。

顺便说一下,对于这种用例,您可以只使用 docker 中的 docker,图像来自 docker。

https://asciinema.org/a/24707

https://hub.docker.com/_/docker/

避免这种情况的快速方法。将您的用户添加到组中。

sudo gpasswd -a $USER docker

然后设置适当的权限。

sudo setfacl -m user:<your username>:rw /var/run/docker.sock

从那里应该不错。

权限匹配仅发生在numeric 用户ID 和组ID 上。如果套接字文件是模式 0660 并且由用户 ID 0 和组 ID 32 拥有,并且您以用户 ID 1000 和组 ID 1000 和 16 的用户身份调用它,那么一个 /etc/group 并不重要文件名 gid 32 为 docker,另一个文件名 gid 16 相同;数字 gid 不同,您无法访问该文件。此外,由于 Docker 组的实际数字 gid 会因系统而异,因此您无法将其放入 Docker 文件中。

许多 Docker 图像只是 运行 作为 root;如果他们这样做,他们可以访问绑定安装的 Docker 套接字文件,而不管其权限如何。

如果您 运行 作为非根用户,您可以使用 docker run --group-add option 为有效用户添加一个(数字)gid;它不需要在 /etc/groups 文件中特别提及。在 Linux 主机上,您可能 运行:

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

您通常不会在 Docker 文件中安装 sudo(它不适用于非交互式程序,您通常不会在交互式 shells 因为容器的短暂性质,你总是可以 docker exec -u 0 获得 root shell) 尽管安装一些非 root 用户通常被认为是最佳实践。您可以将 Docker 文件缩减为

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"]

(That Docker base image has a couple of things 并不真正符合 Docker 最佳实践,而且似乎没有定期更新;我只是使用标准 node 图像作为基础并在其上添加您需要的一个构建工具。)

打开终端并输入此命令

sudo chmod 666 /var/run/docker.sock

让我知道结果...