我可以将 Docker 映像作为卷装入 Docker 中吗?
Can I mount a Docker image as a volume in Docker?
我想分发一些更大的静态 files/assets 作为 Docker 图像,以便用户可以像拉取应用程序本身一样轻松地拉下这些可选文件。但是我真的找不到将文件从一个 Docker 图像公开到另一个图像的好方法?有没有办法将 Docker 图像本身(或其中的目录)作为卷安装到其他 Docker 容器?
我知道有一些我可以使用的音量插件,但我找不到任何可以使用这个或类似东西的地方?
不知道有什么直接的方法。
您可以使用主机中的文件夹作为共享内容的桥梁,这是实现此目的的间接方式。
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,将assets复制到your_assets_folder_in_your_image_container(作为卷的那个,CMD在卷之后执行)
这可能会浪费时间,但只是在资产容器第一次启动时。而在容器启动后,assets container 中的文件实际上是复制到 host 文件夹中,与 assets image 没有关系 none 了。所以你可以只删除资产图像的图像。那就没有space浪费了。
你的目标只是想让其他人容易使用资产,所以为什么不给他们提供脚本,自动获取图像 -> 启动容器(CMD 自动复制文件到卷) -> 删除 image/container -> 资产已经在主机上,所以人们只需将这个主机资产作为一个卷来做接下来的事情。
当然,如果容器可以直接使用其他镜像的资源,就比这个方案要好。无论如何,这可能是一个解决方案,但并不完美。
您可以将 docker 袜子添加为一个卷,这样您就可以从 docker 容器中启动您的 docker 图像之一。
为此,请添加以下两个卷:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/usr/bin/docker:/usr/bin/docker"
如果您需要在容器之间共享文件,请在启动两个容器时映射卷 /tmp:/tmp
。
可以创建 图像的任何目录 到 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_volume
图片中的数据 your_docker_image
无法将整个映像装载到卷中的原因是因为 docker 不允许指定 /
作为命名卷的来源。即使您尝试使用 docker-compose.
,您也会得到 Cannot create container for service your-srv: invalid volume spec "/": invalid volume specification: '/'
我想分发一些更大的静态 files/assets 作为 Docker 图像,以便用户可以像拉取应用程序本身一样轻松地拉下这些可选文件。但是我真的找不到将文件从一个 Docker 图像公开到另一个图像的好方法?有没有办法将 Docker 图像本身(或其中的目录)作为卷安装到其他 Docker 容器?
我知道有一些我可以使用的音量插件,但我找不到任何可以使用这个或类似东西的地方?
不知道有什么直接的方法。
您可以使用主机中的文件夹作为共享内容的桥梁,这是实现此目的的间接方式。
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,将assets复制到your_assets_folder_in_your_image_container(作为卷的那个,CMD在卷之后执行)
这可能会浪费时间,但只是在资产容器第一次启动时。而在容器启动后,assets container 中的文件实际上是复制到 host 文件夹中,与 assets image 没有关系 none 了。所以你可以只删除资产图像的图像。那就没有space浪费了。
你的目标只是想让其他人容易使用资产,所以为什么不给他们提供脚本,自动获取图像 -> 启动容器(CMD 自动复制文件到卷) -> 删除 image/container -> 资产已经在主机上,所以人们只需将这个主机资产作为一个卷来做接下来的事情。
当然,如果容器可以直接使用其他镜像的资源,就比这个方案要好。无论如何,这可能是一个解决方案,但并不完美。
您可以将 docker 袜子添加为一个卷,这样您就可以从 docker 容器中启动您的 docker 图像之一。
为此,请添加以下两个卷:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/usr/bin/docker:/usr/bin/docker"
如果您需要在容器之间共享文件,请在启动两个容器时映射卷 /tmp:/tmp
。
可以创建 图像的任何目录 到 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_volume
图片中的数据 your_docker_image
无法将整个映像装载到卷中的原因是因为 docker 不允许指定 /
作为命名卷的来源。即使您尝试使用 docker-compose.
Cannot create container for service your-srv: invalid volume spec "/": invalid volume specification: '/'