在Unix:///var/run/docker.sock上拒绝Docker守护程序套接字的权限

时间:2018-11-02 23:28:23

标签: bash docker gulp dockerfile docker-run

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

我收到此错误:

  

尝试在unix:///var/run/docker.sock上连接到Docker守护进程套接字时,获得权限被拒绝:获取http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/json:拨打unix /var/run/docker.sock:connect:权限拒绝

如何从chekote/gulp:latest创建docker映像,以便我可以在其中使用docker而不会出现错误?

还是错误可能是由于错误的docker run命令引起的?

5 个答案:

答案 0 :(得分:11)

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

sudo gpasswd -a $USER docker

然后设置适当的权限。

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

从那里应该很好。

答案 1 :(得分:2)

权限匹配仅在数字用户ID和组ID上发生。如果套接字文件的模式为0660,并由用户ID 0和组ID 32拥有,并且您以用户ID 1000,组ID 1000和16的用户身份对其进行调用,则是否有一个/etc/group文件名gid 32为docker,其他文件名gid 16相同;数字编号不同,您无法访问该文件。另外,由于Docker组的实际数字差异在不同的系统中会有所不同,因此您无法将其纳入Dockerfile。

许多Docker镜像只是以root身份运行;如果这样做,则无论其权限如何,他们都可以访问绑定安装的Docker套接字文件。

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

docker run --group-add $(getent group docker | cut -d: -f3) ...

通常不会在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"]

That Docker base imagea couple of things与Docker最佳实践并不完全匹配,并且似乎没有进行定期更新;我只是将标准node图像用作基础,并在其顶部添加您需要的一个构建工具。)

答案 2 :(得分:0)

该错误与docker pull或docker image子命令无关,但您需要以对Docker套接字具有写访问权限的用户身份调用docker命令(例如,以root身份,使用sudo,或加入docker组。

答案 3 :(得分:0)

您需要在docker run命令中使用--privileged标志。

顺便说一句,您可以仅在docker中使用docker,从docker获取映像以用于这种用例。

https://asciinema.org/a/24707

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

答案 4 :(得分:0)

打开终端并输入此命令

sudo chmod 666 /var/run/docker.sock

让我知道结果...