使用docker-dind时,如何给非root用户访问docker?

我正在尝试使用docker-dind运行Go CD代理来自动构build一些泊坞窗图像。

我无法让用户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 

我的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 

我的docker.sock权限如下:

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

我需要附加到我的Dockerfile以便让用户访问docker守护进程?

dind中运行一个dind容器,IE泊坞窗时,它通常会将主机上的/var/run/docker.sock:/var/run/docker.sock挂载到dind-container中。

发生这种情况时,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 – > dockerangular色派生的。

由于几乎不可能确保在映像首次构build时我们有一个公共的组ID,所以应该在运行时使用您的docker-entrypoint.sh文件分配组ID。

我个人的目标是让这个运行时用户转到GO CD go-agent,但是可以用jenkins或其他运行时用户replace这个方法。

由于dind&go-agent都是基于高山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文件,你应该看到以下内容:

 docker:x:993:go 

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

 sudo groupadd docker sudo usermod -aG docker go 

如果您以go用户身份运行此命令,则需要在完成上述任务后注销并login。