Docker构成如何将路径从一个容器挂载到另一个容器?

时间:2017-04-22 13:10:15

标签: docker docker-compose dockerfile

nignx containerasset container我的所有资产都来自grunt或其他工具。

现在在docker compose文件中,我想将asset container's的文件夹路径挂载到nginx container,以便nginx可以提供这些文件。

  • 我们怎么做?我不记得,但我认为有一个选项,我们可以分享一个容器与另一个容器的路径。

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

  • 如果我放大asset container那会发生什么?

  • 我也希望与我的主机一起安装,以便轻松完成开发。

1 个答案:

答案 0 :(得分:40)

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

完全在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 中,除了卷安装。然后再制作两个文件。

  • 搬运工-compose.dev.yml
  • 搬运工-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中,并且只保留备用文件中的最小差异集。

示例:

<强>搬运工-compose.prod.yml

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

<强>搬运工-compose.dev.yml

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