Docker compose如何将一个容器的路径挂载到另一个容器中?

63
我有一个 nignx 容器 和一个 资产容器,其中包含了所有从 grunt 或其他工具构建的资产。
现在在 Docker Compose 文件中,我想将 asset 容器 的文件夹路径挂载到 nginx 容器 中,以便 nginx 可以提供这些文件。
  • 怎么做? 我记不清了,但是我认为有一个选项可以共享一个容器的路径给另一个容器。

  • 假设我将 nginx 扩展到 2 个容器,那么该挂载是否适用于 nginx 的所有实例?

  • 如果我扩大 asset 容器,会发生什么?

  • 我还想将其挂载到我的主机上,以便开发可以更轻松地进行。

1个回答

108

你需要做的是使用一个卷,并将该卷挂载到你想要它出现在的任何容器中。

完全在Docker内部

你可以完全在 Docker 内部完成这个过程。

这里有一个例子(精简版 - 实际文件当然会比这个多得多)。

version: '3'
services:
  nginx:
    volumes:
      - asset-volume:/var/lib/assets
  asset:
    volumes:
      - asset-volume:/var/lib/assets

volumes:
  asset-volume:
在底部定义了一个单独的卷,名为“asset-volume”。
然后在每个服务中,您告诉Docker将该卷挂载到某个路径上。我在容器内展示了示例路径,只需将其调整为容器内希望它们存在的任何路径即可。
该卷是一个独立的实体,不归属于任何特定的容器。它只是被挂载到每个容器中,并且是共享的。如果一个容器修改了内容,则它们所有的容器都会看到更改。
请注意,如果您希望仅有一个容器对其进行更改,则始终可以将该卷作为只读卷挂载到某些服务中,方法是在卷字符串的末尾添加:ro。
services:
  servicename:
    volumes:
      - asset-volume:/var/lib/assets:ro

使用主机目录

另一种方法是使用主机上的目录并将其挂载到容器中。这样做的好处是您可以直接使用Docker之外的工具(例如GUI文本编辑器和其他工具)在文件上进行操作。

这与前面的方法相同,只不过您不需要在Docker中定义一个卷,而是将外部目录挂载进来即可。

version: '3'
services:
  nginx:
    volumes:
      - ./assets:/var/lib/assets
  asset:
    volumes:
      - ./assets:/var/lib/assets
在这个示例中,本地目录"assets"使用相对路径./assets被挂载到两个容器中。

根据环境同时使用

您还可以为不同的开发和生产环境设置它。将所有内容放入docker-compose.yml中,除了卷挂载。然后再创建两个文件。

  • docker-compose.dev.yml
  • docker-compose.prod.yml

在这些文件中,只需放置定义卷挂载的最小配置。我们将把这与docker-compose.yml混合以得到最终配置。

然后使用此方法。它将使用docker-compose.yml中的配置,并将第二个文件中的任何内容作为覆盖或补充配置。

docker-compose -f docker-compose.yml \
    -f docker-compose.dev.yml \
    up -d

对于生产环境,只需使用 prod 文件而不是 dev 文件。

这里的想法是将大部分配置保留在docker-compose.yml中,只将最小化的区别设置在备用文件中。

示例:

docker-compose.prod.yml

version: '3'
services:
  nginx:
    volumes:
      - asset-volume:/var/lib/assets

docker-compose.dev.yml

version: '3'
services:
  nginx:
    volumes:
      - ./assets:/var/lib/assets

请问如何将资产卷与主机挂载以便进行开发,使得两者可以同步? - dev.meghraj
我能不能同时使用它们? - dev.meghraj
@dev.mraj 如果您使用第二种方法,那基本上就是这样。一个在外部主机上的卷也可以在容器中使用。 - Dan Lowe
第一种方法看起来更好,而且在服务器上我想使用它,那么在开发服务器上我不能将资产卷挂载到我的主机目录吗? - dev.meghraj
1
@dev.mraj 我更新了我的回答。现在它展示了如何使用叠加合成文件来适应多个环境(比如开发和生产)。 - Dan Lowe
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接