【问题标题】:Can I mount a Docker image as a volume in Docker?我可以将 Docker 映像挂载为 Docker 中的卷吗?
【发布时间】:2018-10-29 21:21:05
【问题描述】:

我想以 Docker 映像的形式分发一些较大的静态文件/资产,以便用户可以轻松地拉取这些可选文件,就像拉取应用程序本身一样。但是我真的找不到一种将文件从一个 Docker 映像公开到另一个的好方法吗?有没有办法将 Docker 映像本身(或其中的目录)作为卷挂载到其他 Docker 容器?

我知道我可以使用音量插件,但我找不到任何我可以使用的地方或类似的东西?

【问题讨论】:

    标签: docker docker-image


    【解决方案1】:

    可以将图像的任何目录创建到 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: '/'

    【讨论】:

    • 你确定这会起作用吗?因为对我来说,Docker 在/dir_with_data_you_need 中的数据上安装了一个空卷,所以你并不能真正访问映像中的文件。
    • 或许这真的有效。绑定卷和非绑定卷之间存在差异。
    • 这确实有效。如果您在映像内的目录顶部安装非绑定卷,则该目录的内容将复制到该卷中。对我来说,问题是复制意味着不必要的双倍磁盘空间使用。
    • 对我来说,我只是最终两边都是一个空目录...
    【解决方案2】:

    不知道有什么直接的方法。

    您可以使用主机中的文件夹作为共享内容的桥梁,这是实现此目的的间接方式。

    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的图层或使用指定另一个图像的覆盖,也许可以调查一下。
    【解决方案3】:

    您可以将 docker sock 添加为一个卷,这将允许您从 docker 容器中启动一个 docker 映像。

    为此,请添加以下两个卷:

    - "/var/run/docker.sock:/var/run/docker.sock"
    - "/usr/bin/docker:/usr/bin/docker"
    

    如果您需要在容器之间共享文件,请在启动两个容器时映射卷 /tmp:/tmp

    【讨论】:

    • 文件在映像中,因此映射卷将不起作用。然后我必须在文件容器内将所有文件复制到卷中,这会浪费空间。
    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 2020-03-27
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    相关资源
    最近更新 更多