我想从头开始在容器内运行的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"
}
],
我尝试过的事情:
touch /var/run/docker.sock
在 builder 上,而COPY --chown=nobody:nobody --from=builder /var/run /var/run
在最终
不同的用户(我拒绝以root用户身份运行。这是错误的做法)。
将最终中的任何人都添加到码头工人组。
编辑:
在此配置下,由于用户没有访问/var/run/docker.socket
的权限,我收到以下错误,提示没人尝试连接Docker守护程序时拒绝获得权限 unix:///var/run/docker.sock上的套接字:获取 http://%2Fvar%2Frun%2Fdocker.sock/v1.25/services:拨打Unix /var/run/docker.sock:连接:权限被拒绝
答案 0 :(得分:2)
要与docker守护进程通信,您需要以root(或sudo)身份运行命令,或者您的用户必须是docker组的成员。
为了从非root用户使用它而不使用sudo,您将需要在容器内部 创建docker组并将您的用户添加到该组。 注意:容器组内部中的Docker组必须与主机上的 actual 码头组具有相同的GID。