对位于 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。
避免这种情况的快速方法。将您的用户添加到组中。
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
让我知道结果...
我有这个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。
避免这种情况的快速方法。将您的用户添加到组中。
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
让我知道结果...