1

我正在尝试从 docker 容器内部启动一个 docker 容器。我发现了多个有关此问题的帖子,但不适用于此特定情况。到目前为止我发现的是,我需要在容器中安装 docker,并将主机 /var/run/docker.sh 挂载到容器的 /var/run/docker.sh。
但是我得到了错误:

无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。docker 守护进程是否正在运行?我的 Dockerfile:

FROM golang:alpine as builder
RUN mkdir /build
ADD . /build/
WORKDIR /build
RUN go build -o main .
FROM alpine
RUN adduser -S -D -H -h /app appuser
RUN apk update && apk add --no-cache docker-cli
COPY --from=builder /build/main /app/
WORKDIR /app
USER root
ENTRYPOINT [ "/app/main" ]

我从 Go 代码运行的命令:

// Start a new docker
cmd := exec.Command("docker", "ps") // Changed to "ps" just as a quick check
cmd.Run()

我运行的命令启动第一个 docker 容器:

docker run --privileged -v /var/run/docker.sh:/var/run/docker.sh firsttest:1.0

为什么容器无法连接到 docker daemon?我需要包含其他内容吗?我尝试将 Go 命令作为 sudo 运行,但正如预期的那样:

exec: "sudo": $PATH 中找不到可执行文件

我试图将 Dockerfile 中的用户更改为 root,这并没有改变任何东西。我也无法在容器本身上启动 docker 守护进程:

exec:“服务”:在 $PATH 中找不到可执行文件

我是否误解了某些内容,或者我是否需要在 Dockerfile 中包含其他内容?实在想不通,多谢帮助!

4

1 回答 1

3

我不确定您为什么要在 Docker 容器中运行 Docker,除非您是 Docker 开发人员。当我想做这样的事情时,我试图解决某种潜在的架构问题,我应该首先解决这个问题。

如果你真的想要这个,你可以将 /var/run/docker.sock 挂载到你的容器中:

docker run --privileged -v /var/run/docker.sh:/var/run/docker.sh -v /var/run/docker.sock:/var/run/docker.sock firsttest:1.0
于 2020-08-25T09:46:33.130 回答