Docker如何将路径从一个容器装载到另一个容器?

Docker如何将路径从一个容器装载到另一个容器?,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我有nignx容器和一个asset容器,它们让我的所有资产都从grunt或其他工具构建 现在在docker compose文件中,我想将资产容器的文件夹路径装载到nginx容器中,以便nginx可以为这些文件提供服务 我们怎么能做到呢?我不记得了,但我认为有一种选择,我们可以共享一个容器和另一个容器的路径 假设我将nginx扩展到2个容器,那么挂载是否适用于所有nginx实例 如果我放大资产容器,会发生什么 我还想挂载与我的主机,以便开发可以很容易地完成 您要做的是使用一个卷,然后将该卷装入您

我有
nignx容器
和一个
asset容器
,它们让我的所有资产都从grunt或其他工具构建

现在在docker compose文件中,我想将
资产容器的
文件夹路径装载到
nginx容器
中,以便nginx可以为这些文件提供服务

  • 我们怎么能做到呢?我不记得了,但我认为有一种选择,我们可以共享一个容器和另一个容器的路径

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

  • 如果我放大
    资产容器
    ,会发生什么

  • 我还想挂载与我的主机,以便开发可以很容易地完成


您要做的是使用一个卷,然后将该卷装入您希望它出现在其中的任何容器中

完全在Docker内部 你完全可以在Docker内部完成

下面是一个例子(精简-您的真实文件中当然会包含更多内容)

版本:“3”
服务:
nginx:
卷数:
-资产量:/var/lib/assets
资产:
卷数:
-资产量:/var/lib/assets
卷数:
资产量:
底部是定义的单个卷,名为“资产卷”

然后在您的每个服务中,您告诉Docker在特定路径上装载该卷。我展示了容器中的示例路径,只需将它们调整为您希望它们位于容器中的任何路径

卷是不属于任何特定容器的独立实体。它只是被安装到它们中的每一个,并被共享。如果一个容器修改了内容,那么它们都会看到更改

请注意,如果您希望只有一个卷可以进行更改,则可以在某些服务中始终以只读方式装载卷,方法是在卷字符串的末尾添加
:ro

服务:
服务名称:
卷数:
-资产量:/var/lib/assets:ro
使用主机目录 或者,您可以使用主机上的目录并将其装载到容器中。这样做的好处是,您可以使用Docker之外的工具(例如GUI文本编辑器和其他工具)直接处理文件

这是相同的,只是您没有在Docker中定义卷,而是装载外部目录

版本:“3”
服务:
nginx:
卷数:
-/资产:/var/lib/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

版本:“3”
服务:
nginx:
卷数:
-资产量:/var/lib/assets
docker compose.dev.yml

版本:“3”
服务:
nginx:
卷数:
-/资产:/var/lib/assets

您是否可以让我知道如何将其装载到主机上以进行开发…意味着如何将资产卷装载到主机上,以便两者都可以同步。@dev.mraj请参阅更新的答案。我添加了一个使用外部目录而不是Docker卷的示例。我不能同时使用这两个目录吗?Means volume sync with host(对于dev env)@dev.mraj我更新了我的答案。现在,它展示了如何使用overlay compose文件使您的配置适应多个环境(如dev和prod)。