在使用docker dind时,如何授予非root用户对docker的访问权限?

在使用docker dind时,如何授予非root用户对docker的访问权限?,docker,go-cd,docker-dind,Docker,Go Cd,Docker Dind,我正在尝试使用docker dind运行Go CD代理来自动生成一些docker映像 我无法让用户go访问docker守护进程 当我尝试访问docker信息时,我得到以下信息: [go] Task: /bin/sh ./builder.shtook: 2.820s [START] [USER] go [TAG] manual Got permission denied while trying to connect to the Docker daemon socket at unix:/

我正在尝试使用docker dind运行Go CD代理来自动生成一些docker映像

我无法让用户
go
访问docker守护进程

当我尝试访问docker信息时,我得到以下信息:

[go] Task: /bin/sh ./builder.shtook: 2.820s
[START]
[USER]  go
[TAG]  manual

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.32/containers/fish/angular-cli/json: dial unix /var/run/docker.sock: connect: permission denied
Sending build context to Docker daemon  3.072kB

Step 1/8 : FROM node:8-alpine
 ---> 4db2697ce114
Step 2/8 : MAINTAINER jack@fish.com
 ---> Using cache
 ---> 22f46bf6b4c1
Step 3/8 : VOLUME /usr/local/share/.cache/yarn/v1
 ---> Using cache
 ---> 86b979e7a2b4
Step 4/8 : RUN apk add --no-cache --update build-base python
 ---> Using cache
 ---> 4a08b0a1fc9d
Step 5/8 : RUN yarn global add @angular/cli@1.5.3
 ---> Using cache
 ---> 6fe4530181a5
Step 6/8 : EXPOSE 4200
 ---> Using cache
 ---> 480edc47696e
Step 7/8 : COPY ./docker-entrypoint.sh /
 ---> Using cache
 ---> 329f9eaa5c76
Step 8/8 : ENTRYPOINT /docker-entrypoint.sh
 ---> Using cache
 ---> cb1180ff8e9f
Successfully built cb1180ff8e9f
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.32/containers/fish/angular-cli/json: dial unix /var/run/docker.sock: connect: permission denied
docker:x:993:go
My
root
用户可以正确访问docker信息,但是
go
用户失败

$ cat /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
....
adm:x:4:root,adm,daemon
wheel:x:10:root
xfs:x:33:xfs
ping:x:999:
nogroup:x:65533:
nobody:x:65534:
dockremap:x:101:dockremap,go
go:x:1000:go
My docker.sock权限如下:

$ ls -alh /var/run/docker.sock
srw-rw----    1 root     993            0 Apr 20  2017 /var/run/docker.sock

为了允许
go
用户访问docker守护进程,我需要在docker文件中附加什么

为了允许其他用户访问Docker,您需要:

sudo groupadd docker
sudo usermod -aG docker go

如果您作为
go
用户运行此命令,您需要在执行上述任务后注销并登录。

为了允许其他用户访问Docker,您需要:

sudo groupadd docker
sudo usermod -aG docker go

如果您作为
go
用户运行此命令,则需要在执行上述任务后注销并登录。

当运行
dind
容器时,即docker in docker中的docker,它是将
/var/run/docker.sock:/var/run/docker.sock
从主机装入dind容器的常用位置

发生这种情况时,PID不仅归root所有,还归主机的数字组id所有

在容器内运行以下命令应显示主机GID:

$ ls -alh /var/run/docker.sock
srw-rw----    1 root     993            0 Apr 20  2017 /var/run/docker.sock
上面的进程属于组993,993是从主机/etc/group->docker角色派生的

由于在首次构建映像时几乎不可能确保我们有一个公共组id,因此应该在运行时使用
docker entrypoint.sh
文件分配组id

我个人的目标是为go CD go代理获取“go”的运行时用户,但是可以用这种方法代替jenkins或任何其他运行时用户

由于dind和go代理都基于alpine linux,以下内容适用于alpine linux:

#setup docker group based on hosts mount gid
echo "Adding hosts GID to docker system group"
# this only works if the docker group does not already exist
DOCKER_SOCKET=/var/run/docker.sock
DOCKER_GROUP=docker
BUILD_USER=go

if [ -S ${DOCKER_SOCKET} ]; then
    DOCKER_GID=$(stat -c '%g' ${DOCKER_SOCKET})

    #addgroup is distribution specific

    addgroup -S -g ${DOCKER_GID} ${DOCKER_GROUP}
    addgroup  ${BUILD_USER} ${DOCKER_GROUP}
fi
如果执行到容器中,并对/etc/group文件进行cat,则应看到以下内容:

[go] Task: /bin/sh ./builder.shtook: 2.820s
[START]
[USER]  go
[TAG]  manual

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.32/containers/fish/angular-cli/json: dial unix /var/run/docker.sock: connect: permission denied
Sending build context to Docker daemon  3.072kB

Step 1/8 : FROM node:8-alpine
 ---> 4db2697ce114
Step 2/8 : MAINTAINER jack@fish.com
 ---> Using cache
 ---> 22f46bf6b4c1
Step 3/8 : VOLUME /usr/local/share/.cache/yarn/v1
 ---> Using cache
 ---> 86b979e7a2b4
Step 4/8 : RUN apk add --no-cache --update build-base python
 ---> Using cache
 ---> 4a08b0a1fc9d
Step 5/8 : RUN yarn global add @angular/cli@1.5.3
 ---> Using cache
 ---> 6fe4530181a5
Step 6/8 : EXPOSE 4200
 ---> Using cache
 ---> 480edc47696e
Step 7/8 : COPY ./docker-entrypoint.sh /
 ---> Using cache
 ---> 329f9eaa5c76
Step 8/8 : ENTRYPOINT /docker-entrypoint.sh
 ---> Using cache
 ---> cb1180ff8e9f
Successfully built cb1180ff8e9f
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.32/containers/fish/angular-cli/json: dial unix /var/run/docker.sock: connect: permission denied
docker:x:993:go

当运行
dind
容器时,即docker中的docker,它是将主机中的
/var/run/docker.sock:/var/run/docker.sock
卷装入dind容器的常见位置

发生这种情况时,PID不仅归root所有,还归主机的数字组id所有

在容器内运行以下命令应显示主机GID:

$ ls -alh /var/run/docker.sock
srw-rw----    1 root     993            0 Apr 20  2017 /var/run/docker.sock
上面的进程属于组993,993是从主机/etc/group->docker角色派生的

由于在首次构建映像时几乎不可能确保我们有一个公共组id,因此应该在运行时使用
docker entrypoint.sh
文件分配组id

我个人的目标是为go CD go代理获取“go”的运行时用户,但是可以用这种方法代替jenkins或任何其他运行时用户

由于dind和go代理都基于alpine linux,以下内容适用于alpine linux:

#setup docker group based on hosts mount gid
echo "Adding hosts GID to docker system group"
# this only works if the docker group does not already exist
DOCKER_SOCKET=/var/run/docker.sock
DOCKER_GROUP=docker
BUILD_USER=go

if [ -S ${DOCKER_SOCKET} ]; then
    DOCKER_GID=$(stat -c '%g' ${DOCKER_SOCKET})

    #addgroup is distribution specific

    addgroup -S -g ${DOCKER_GID} ${DOCKER_GROUP}
    addgroup  ${BUILD_USER} ${DOCKER_GROUP}
fi
如果执行到容器中,并对/etc/group文件进行cat,则应看到以下内容:

[go] Task: /bin/sh ./builder.shtook: 2.820s
[START]
[USER]  go
[TAG]  manual

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.32/containers/fish/angular-cli/json: dial unix /var/run/docker.sock: connect: permission denied
Sending build context to Docker daemon  3.072kB

Step 1/8 : FROM node:8-alpine
 ---> 4db2697ce114
Step 2/8 : MAINTAINER jack@fish.com
 ---> Using cache
 ---> 22f46bf6b4c1
Step 3/8 : VOLUME /usr/local/share/.cache/yarn/v1
 ---> Using cache
 ---> 86b979e7a2b4
Step 4/8 : RUN apk add --no-cache --update build-base python
 ---> Using cache
 ---> 4a08b0a1fc9d
Step 5/8 : RUN yarn global add @angular/cli@1.5.3
 ---> Using cache
 ---> 6fe4530181a5
Step 6/8 : EXPOSE 4200
 ---> Using cache
 ---> 480edc47696e
Step 7/8 : COPY ./docker-entrypoint.sh /
 ---> Using cache
 ---> 329f9eaa5c76
Step 8/8 : ENTRYPOINT /docker-entrypoint.sh
 ---> Using cache
 ---> cb1180ff8e9f
Successfully built cb1180ff8e9f
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.32/containers/fish/angular-cli/json: dial unix /var/run/docker.sock: connect: permission denied
docker:x:993:go

不完全是这样-看起来docker.sock文件仍然属于“主机”组993。如何使GroupID匹配?不完全匹配-docker.sock文件似乎仍然属于“主机”组993。如何获取要匹配的GroupID?如果容器以非根用户身份运行,这是否可行,因为entrypoint随后以非根权限运行?如果容器以非根用户身份运行,这是否可行,因为entrypoint随后以非根权限运行?