【问题标题】:How do I re-share volumes between Docker-in-Docker containers?如何在 Docker-in-Docker 容器之间重新共享卷?
【发布时间】:2021-10-10 09:33:27
【问题描述】:

我已将卷 shared 安装到我的服务 main。 现在我正在尝试将相同的卷挂载到另一个容器client,该容器以docker-compose up clientmain 容器(Docker-in-Docker)中开始:

version: "3.8"

# set COMPOSE_PROJECT_NAME=default before running `docker-compose up main`

services:
  main:
    image: rbird/docker-compose:python-3.9-slim-buster
    privileged: true
    entrypoint: docker-compose up client # start client
    volumes:
      - //var/run/docker.sock:/var/run/docker.sock
      - ./docker-compose.yml:/docker-compose.yml
      - ./shared:/shared

  client:
    image: alpine
    entrypoint: sh -c "ls shared*"
    profiles:
      - do-not-run-directly
    volumes:
      - /shared:/shared1
      - ./shared:/shared2

我得到的输出是:

[+] Running 2/2
 - Network test_default   Created                                                                                                                                                                                       0.0s
 - Container test_main_1  Started                                                                                                                                                                                       0.9s
Attaching to main_1
Recreating default_client_1 ... done
Attaching to default_client_1
main_1  | client_1  | shared1:
main_1  | client_1  |
main_1  | client_1  | shared2:
main_1  | default_client_1 exited with code 0
main_1 exited with code 0

因此,/shared2/shared2 文件夹是空的,尽管它们包含主机目录和 main 容器中的文件。

如何在容器之间重新共享卷?

或者有没有办法在所有容器之间共享一个主机目录,即使是由其中一个容器启动的容器?

【问题讨论】:

    标签: docker docker-compose docker-in-docker


    【解决方案1】:

    这里最干净的答案是删除main: 容器和client: 容器的profiles: 块,并直接在主机上运行docker-compose


    您在此处的设置使用主机的 Docker 套接字。 (这不是“Docker-in-Docker”;该设置通常是在容器中运行第二个 Docker 守护程序的更令人困惑的情况。)这意味着容器内的 Docker Compose 实例向主机的 Docker 守护程序发送指令,告诉它要启动什么容器。您将docker-compose.yml 文件挂载到容器的根目录中,因此./shared 路径也被解释为相对于/

    这意味着主机的 Docker 守护进程正在接收创建容器的请求,该容器将/shared 安装在新容器内的/shared1 上,并且还带有/shared./shared,相对到安装在/shared2 上的路径/)。 host 的 Docker 守护程序使用host 路径创建此容器。如果您查看您的主机系统,您可能会在主机文件系统根目录中看到一个空的/shared 目录,如果您在那里创建文件,它们将出现在新容器的/shared1/shared2 目录中。

    一般来说,没有办法将一个容器的文件系统挂载到另一个容器上。如果您尝试从容器中运行docker(或docker-compose),您必须从外部了解您自己的哪些文件系统是卷挂载以及究竟挂载了什么。


    如果可以,请避免使用容器启动其他容器和在容器之间共享卷的方法。如果可以启动另一个容器,并且另一个容器可以挂载主机文件系统的任意部分,那么您可以非常简单地根整个主机。除了安全问题之外,您在此处提到的路径复杂性也很难解决。共享卷在非 Docker 环境中效果不佳(例如,在 Kubernetes 中,很难获得 ReadWriteMany 卷,并且容器通常不会彼此位于同一主机上),并且权限和拥有多个读取器和写入器在同一个文件上。

    改为仅在主机上启动dockerdocker-compose 命令(作为非开发人员系统上的特权用户)。如果一个容器需要将只读内容单向发布到另一个容器,例如静态资产,请创建自定义图像COPY --from= 一个图像到另一个图像。否则,请考虑使用专门构建的网络可访问存储(如数据库),它不特别依赖于文件系统并且知道如何处理并发访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多