【问题标题】:How to give docker container based on scratch access to /var/run/docker.sock如何基于对 /var/run/docker.sock 的临时访问权授予 docker 容器
【发布时间】:2019-10-16 09:44:50
【问题描述】:

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

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"]

docker 服务本身包括/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.sockbuilderCOPY --chown=nobody:nobody --from=builder /var/run /var/runfinal

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

  3. final 中的任何人都添加到 docker 组。

编辑:

在此配置下,我收到以下错误 nobody,因为用户没有访问 /var/run/docker.socket 的权限

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

【问题讨论】:

    标签: docker go


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 2019-09-27
      • 2020-01-03
      • 2018-06-28
      • 1970-01-01
      • 2021-06-16
      • 2018-01-05
      相关资源
      最近更新 更多