【发布时间】:2018-10-29 21:21:05
【问题描述】:
我想以 Docker 映像的形式分发一些较大的静态文件/资产,以便用户可以轻松地拉取这些可选文件,就像拉取应用程序本身一样。但是我真的找不到一种将文件从一个 Docker 映像公开到另一个的好方法吗?有没有办法将 Docker 映像本身(或其中的目录)作为卷挂载到其他 Docker 容器?
我知道我可以使用音量插件,但我找不到任何我可以使用的地方或类似的东西?
【问题讨论】:
标签: docker docker-image
我想以 Docker 映像的形式分发一些较大的静态文件/资产,以便用户可以轻松地拉取这些可选文件,就像拉取应用程序本身一样。但是我真的找不到一种将文件从一个 Docker 映像公开到另一个的好方法吗?有没有办法将 Docker 映像本身(或其中的目录)作为卷挂载到其他 Docker 容器?
我知道我可以使用音量插件,但我找不到任何我可以使用的地方或类似的东西?
【问题讨论】:
标签: docker docker-image
可以将图像的任何目录创建到 docker 卷,但不是完整的图像。至少不是以漂亮或简单的方式。
如果你想从你的镜像创建一个目录作为 docker 卷,你可以创建一个命名卷:
docker volume create your_volume
docker run -d \
-it \
--name=yourcontainer \
-v your_volume:/dir_with_data_you_need \
your_docker_image
从此时起,您将可以使用来自图像your_docker_image 的数据访问your_volume
无法将整个映像挂载到卷中的原因是 docker 不允许将 / 指定为命名卷的源。即使您尝试使用 docker-compose,您也会得到 Cannot create container for service your-srv: invalid volume spec "/": invalid volume specification: '/'。
【讨论】:
/dir_with_data_you_need 中的数据上安装了一个空卷,所以你并不能真正访问映像中的文件。
不知道有什么直接的方法。
您可以使用主机中的文件夹作为共享内容的桥梁,这是实现此目的的间接方式。
docker run -d -v /any_of_your_host_folder:/your_assets_folder_in_your_image_container your_image
docker run -d -v /any_of_your_host_folder:/your_folder_of_your_new_container your_container_want_to_use_assets
对于your_image,您需要在dockerfile中添加CMD以将资产复制到your_assets_folder_in_your_image_container(您用作卷的CMD在卷之后执行的那个)
这可能会浪费时间,但只是在资产容器第一次启动时。而在容器启动后,assets 容器中的文件实际上是复制到了host 文件夹中,不再与assets image 有任何关系。所以你可以只删除资产图像的图像。这样就不会浪费空间了。
您的目标只是希望其他人易于使用资产,所以为什么不为他们提供脚本,自动获取图像 -> 启动容器(CMD 自动复制文件到卷) -> 删除图像/容器 ->资产已在主机上,因此人们只需将此主机资产用作卷来执行下一步操作。
当然,如果容器可以直接使用其他图片的资源,那就比这个方案好。无论如何,这可能是一个解决方案,虽然并不完美。
【讨论】:
CMD 中。它真的很浪费空间,取决于您的资产大小。但是如果很多容器需要使用这些资产,这可能是一个解决方案。我不知道docker是否可以直接处理带有aufs的图层或使用指定另一个图像的覆盖,也许可以调查一下。
您可以将 docker sock 添加为一个卷,这将允许您从 docker 容器中启动一个 docker 映像。
为此,请添加以下两个卷:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/usr/bin/docker:/usr/bin/docker"
如果您需要在容器之间共享文件,请在启动两个容器时映射卷 /tmp:/tmp。
【讨论】: