Я бы хотел использовать сокет Docker на хосте из кода Go, работающего внутри контейнера на основе нуля.
Файл Docker выглядит примерно так:
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 в группу докеров.
EDIT:
В этой конфигурации Iполучить следующую ошибку: nobody , поскольку у пользователя нет прав доступа /var/run/docker.socket
Получено разрешение при попытке подключения к сокету демона Dockerв unix: ///var/run/docker.sock: получить http://%2Fvar%2Frun%2Fdocker.sock/v1.25/services: набрать unix /var/run/docker.sock: подключиться: разрешение запрещено