一尘不染

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

docker

nignx container和一个asset container拥有我所有资产的工具都来自grunt或其他一些工具。

现在在docker compose文件中,我想将asset container's的文件夹路径装入到其中,nginx container以便nginx可以提供该文件。

  • 我们该怎么做?我不记得了,但我认为有一种选择可以使我们将一个容器的路径与另一个容器共享。

  • 假设如果我将nginx扩展到2个容器,那么该安装将适用于所有nginx实例吗?

  • 如果我扩大规模,asset container那会发生什么?

  • 我也想将其安装在主机上,以便轻松进行开发。


阅读 699

收藏
2020-06-17

共1个答案

一尘不染

您要做的就是使用一个卷,然后将该卷安装到您希望其出现的任何容器中。

完全在Docker中

您可以完全在Docker内部完成此操作。

这是一个示例(精简-您的实际文件中将包含更多内容)。

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

volumes:
  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

根据环境使用两者

您还可以将其设置为其他开发和生产环境。将所有内容放入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
2020-06-17