4

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

在我的 Dockerfile 中,我必须安装 Docker,所以 Docker 中的 Docker。

FROM alpine:3.9 

RUN apk add --update --no-cache docker

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

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

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

usermod -a -G docker $USER

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

PS:

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

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

谢谢

4

2 回答 2

0

我设法以简单的方式做到了

docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker --privileged docker:dind sh

我在我的测试环境中使用这个命令!

于 2022-02-07T16:26:37.513 回答
-1

您可以这样做,并且您的第一个想法是正确的:只需将 docker socket ( /var/run/docker.sock) 暴露给“控制”容器即可。这样做:

host:~$ docker run \
                  -v /var/run/docker.sock:/var/run/docker.sock \  
                  <my_image>
host:~$ docker exec -u root -it <container id> /bin/sh

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

root@guest:/# docker ps -a

CONTAINER ID        IMAGE                 COMMAND                  CREATED       ...
69340bc13bb2        my_image              "/sbin/tini -- /usr/…"   8 minutes ago ...

这是否是一个好主意是值得商榷的。如果有任何方法可以避免,我建议不要这样做。这是一个安全漏洞,本质上将使用容器的一些主要好处抛到了脑后:隔离和控制权限提升。

于 2020-03-12T07:41:51.883 回答