12

我有这个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:连接:权限被拒绝

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

或者错误可能是因为错误的 docker run 命令?

4

5 回答 5

56

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

sudo gpasswd -a $USER docker

然后设置适当的权限。

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

从那里应该很好。

于 2018-11-03T06:14:14.677 回答
12

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

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

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

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

您通常不会安装sudo在 Dockerfile 中(它不适用于非交互式程序,由于容器的短暂性,您通常不会在交互式 shell 中做很多事情,而且您总是docker exec -u 0可以获得根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镜像作为基础并添加您需要的一个构建工具最重要的。)

于 2018-11-03T07:47:09.623 回答
6

打开终端并输入此命令

sudo chmod 666 /var/run/docker.sock

让我知道结果...

于 2020-08-18T21:06:06.503 回答
0

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

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

https://asciinema.org/a/24707

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

于 2018-11-03T00:57:44.593 回答
0

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

于 2018-11-02T23:34:29.463 回答