这正是我需要的。我已经有一个项目正在启动一组特定的泊坞窗图像,它完全正常。
但我想创建另一个图像,特别是从头开始构建这个项目,其中包含所有依赖项。因此,问题在于,在构建时,要创建docker镜像,我们需要从构建容器访问在主机上运行的docker守护程序。
有没有办法做到这一点?
答案 0 :(得分:5)
如果需要从容器内部访问主机上的docker,只需使用主机挂载(-v /host/path:/container/path
命令行上的docker run
)公开容器内的Docker套接字。
例如,如果我启动一个新的fedora
容器,在我的主机上公开docker socket:
$ docker run -it -v /var/run/docker.sock:/var/run/docker.sock fedora bash
然后在容器中安装docker
:
[root@d28650013548 /]# yum -y install docker
...many lines elided...
我现在可以在主持人上与docker交谈:
[root@d28650013548 /]# docker info
Containers: 6
Running: 1
Paused: 0
Stopped: 5
Images: 530
Server Version: 17.05.0-ce
...
答案 1 :(得分:2)
您可以让容器通过docker socket访问主机的docker守护程序,并且"欺骗"它将docker可执行文件放在容器中而不在其中安装docker。就这样(用例子的Ubuntu-Xenial容器):
docker run --name dockerInsideContainer -ti -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker ubuntu:xenial
在此内容中,您可以启动任何泊坞窗命令,例如docker images
,以检查它是否有效。
如果您看到如下错误:docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory
,您应该在容器内安装一个名为libltdl7
的包。例如,您可以为容器创建Dockerfile或直接在run:
FROM ubuntu:xenial
apt update
apt install -y libltdl7
或
docker run --name dockerInsideContainer -ti -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker ubuntu:xenial bash -c "apt update && apt install libltdl7 && bash"
希望有所帮助