【发布时间】:2018-01-08 23:42:31
【问题描述】:
这正是我需要的。我已经有一个项目正在启动一组特定的 docker 图像,它工作得很好。
但我想创建另一个图像,特别是从头开始构建这个项目,其中包含所有依赖项。所以,问题是,在构建时,要创建 docker 镜像,我们需要从构建容器访问在主机上运行的 docker daemon。
有什么办法吗?
【问题讨论】:
标签: docker docker-swarm docker-container
这正是我需要的。我已经有一个项目正在启动一组特定的 docker 图像,它工作得很好。
但我想创建另一个图像,特别是从头开始构建这个项目,其中包含所有依赖项。所以,问题是,在构建时,要创建 docker 镜像,我们需要从构建容器访问在主机上运行的 docker daemon。
有什么办法吗?
【问题讨论】:
标签: docker docker-swarm docker-container
如果您需要从容器内部访问主机上的 docker,您可以使用主机挂载(docker run 命令行上的-v /host/path:/container/path)简单地公开容器内的 Docker 套接字。
例如,如果我启动一个新的fedora 容器,暴露主机上的 docker 套接字:
$ 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
...
【讨论】:
apt-get 可用。所有官方的都可以。
您可以让容器通过 docker 套接字访问主机的 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 命令,例如 docker images 以检查它是否正常工作。
如果您看到这样的错误:docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory,您应该在容器内安装一个名为 libltdl7 的包。因此,例如,您可以为容器创建一个 Dockerfile 或直接在运行时安装它:
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"
希望对你有帮助
【讨论】: