如何基于对/var/run/docker.sock的临时访问授予Docker容器

时间:2019-05-30 17:52:55

标签: docker go

我想从头开始在容器内运行的Go代码中使用主机上的Docker套接字。

Dockerfile看起来像这样:


    FROM golang:1.12.4-alpine3.9 as builder

    RUN mkdir /user && \
        echo 'nobody:x:65534:65534:nobody:/:' > /user/passwd && \
        echo 'nobody:x:65534:' > /user/group

    RUN apk add --no-cache ca-certificates git

    WORKDIR /src

    COPY go.mod ./
    RUN go mod download

    COPY . .
    RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

    FROM scratch as final

    COPY --from=builder /user/group /user/passwd /etc/
    COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
    COPY --from=builder /src/app /app
    COPY --chown=nobody:nobody data /.local

    USER nobody:nobody

    ENTRYPOINT ["/app"]

泊坞窗服务本身包含/var/run/docker.sock

的安装座

docker service inspect的输出:


  "Mounts": [
        {
            "Type": "bind",
            "Source": "/var/run/docker.sock",
            "Target": "/var/run/docker.sock"
        }
    ],

我尝试过的事情:

  1. touch /var/run/docker.sock builder 上,而COPY --chown=nobody:nobody --from=builder /var/run /var/run最终

  2. 不同的用户(我拒绝以root用户身份运行。这是错误的做法)。

  3. 最终中的任何人都添加到码头工人组。

编辑:

在此配置下,由于用户没有访问/var/run/docker.socket

的权限,我收到以下错误,提示没人
  

尝试连接Docker守护程序时拒绝获得权限   unix:///var/run/docker.sock上的套接字:获取   http://%2Fvar%2Frun%2Fdocker.sock/v1.25/services:拨打Unix   /var/run/docker.sock:连接:权限被拒绝

1 个答案:

答案 0 :(得分:2)

要与docker守护进程通信,您需要以root(或sudo)身份运行命令,或者您的用户必须是docker组的成员。

为了从非root用户使用它而不使用sudo,您将需要在容器内部 创建docker组并将您的用户添加到该组。 注意:容器组内部中的Docker组必须与主机上的 actual 码头组具有相同的GID。