在 Alpine Docker 中安装 Docker

iAm*_*ric 5 docker dockerfile alpine-linux docker-in-docker

我有一个带有经典 Ubuntu 基础映像的 Dockerfile,我正在尝试减小其大小。这就是我使用 Alpine 底座的原因。

在我的 Dockerfile 中,我必须安装 Docker,因此 Docker in Docker。

FROM alpine:3.9 

RUN apk add --update --no-cache docker
Run Code Online (Sandbox Code Playgroud)

这很好用,我可以docker version在我的容器内运行,至少对于客户端来说是这样。因为对于服务器,我有一个经典的 Docker 错误:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Run Code Online (Sandbox Code Playgroud)

我知道在 Ubuntu 中安装 Docker 后我必须运行

usermod -a -G docker $USER
Run Code Online (Sandbox Code Playgroud)

但在阿尔卑斯山呢?我怎样才能避免这个错误?

附:

我的第一个想法是通过绑定安装等方式重新使用 Docker 套接字/var/run/docker.sock:/var/run/docker.sock,从而进一步减小图像的大小,因为我不必重新安装 Docker。

但是由于Dockerfile中不允许bind-mount,你知道我的想法是否可行以及如何实现?我知道这在 Docker-compose 中是可能的,但我只能使用 Dockerfile。

谢谢

Z4-*_*ier -1

你可以做到这一点,你的第一个想法是正确的:只需要公开 docker 套接字(/var/run/docker.sock ) 暴露给“控制”容器即可。这样做:

\n\n
host:~$ docker run \\\n                  -v /var/run/docker.sock:/var/run/docker.sock \\  \n                  <my_image>\nhost:~$ docker exec -u root -it <container id> /bin/sh\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在容器应该可以访问套接字(我假设您已经在容器内安装了必要的 docker 软件包):

\n\n
root@guest:/# docker ps -a\n\nCONTAINER ID        IMAGE                 COMMAND                  CREATED       ...\n69340bc13bb2        my_image              "/sbin/tini -- /usr/\xe2\x80\xa6"   8 minutes ago ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是否是个好主意还有待商榷。如果有任何方法可以避免的话,我建议不要这样做。这是一个安全漏洞,从本质上来说,使用容器的一些主要好处是无法实现的:隔离和控制权限升级。

\n