【发布时间】: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"
}
],
我尝试过的事情:
touch /var/run/docker.sock在 builder 和COPY --chown=nobody:nobody --from=builder /var/run /var/run在 final不同的用户(我拒绝以 root 身份运行。这是不好的做法)。
将 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: 连接:权限被拒绝
【问题讨论】: