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

qxsslcnc  于 2022-12-08  发布在  Gulp
关注(0)|答案(5)|浏览(120)

我有这个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:连接:权限被拒绝
如何从chekote/gulp:latest创建docker映像,这样我就可以在其中使用docker而不会出现错误?
又或许这个错误是因为错误的Docker运行命令?

4jb9z9bj

4jb9z9bj1#

一个快速的方法来避免这种情况。添加您的用户到组。

sudo gpasswd -a $USER docker

然后设置适当的权限。

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

从那里应该是好的。

nqwrtyyt

nqwrtyyt2#

权限匹配只发生在 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套接字文件的权限如何,他们都可以访问该文件。
如果您以非root用户身份运行,则可以使用docker run --group-add选项为有效用户添加一个(数字)gid;不需要在/etc/groups文件中特别提及。

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

通常不会在Dockerfile中安装sudo(对于非交互式程序来说,它不太好用,因为容器的短暂性,您通常不会在交互式shell中执行很多操作,而且您总是可以通过docker exec -u 0来获得根shell),尽管安装一些非根用户通常被认为是最佳实践。

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有一些东西与Docker的最佳实践并不匹配,而且似乎没有定期更新;我只使用标准的node映像作为基础,并在其上添加您需要的一个构建工具。)

pbossiut

pbossiut3#

打开终端并键入以下命令

sudo chmod 666 /var/run/docker.sock

告诉我结果...

iyfjxgzm

iyfjxgzm4#

您需要在docker运行命令中使用--privileged标志。
顺便说一下,你可以在Docker中使用Docker,这类用例的图像来自Docker。
https://asciinema.org/a/24707
https://hub.docker.com/_/docker/

b4qexyjb

b4qexyjb5#

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

相关问题