dockerdockerfileubuntu-18.04alpine-linuxdocker-daemon

Start docker from docker - Can't connect to daemon


I'm trying to start a docker container from inside a docker container. I found multiple posts about this problem, but not for this specific case. What I found out so far is, that I need to install docker in the container and mount the hosts /var/run/docker.sh to the container's /var/run/docker.sh.
However I get the error:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? My 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" ]

The command I'm running from my Go code:

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

And the command I run to start the first docker container:

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

Why can't the container connect to the docker daemon? Do I need to include something else? I tried to run the Go command as sudo, but as expected:

exec: "sudo": executable file not found in $PATH

And I tried to change the user in the Dockerfile to root, this did not change anything. Also I cannot start the docker daemon on the container itself:

exec: "service": executable file not found in $PATH

Did I misunderstand something or do I need to include something else in the Dockerfile? I really can't figure it out, thanks for the help!


Solution

  • I am not sure as to why you would want to run Docker inside a Docker container, except if you are a Docker developer. When I have felt tempted to do things like this, there was some kind of underlying architectural problem that I was trying to work around and that I should have fixed in the first place.

    If you really want this, you could mount /var/run/docker.sock into your container:

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