【问题标题】:Import docker compose file in another compose file在另一个 compose 文件中导入 docker compose 文件
【发布时间】:2019-04-12 11:11:31
【问题描述】:

是否可以将 docker-compose 文件“导入”或链接到另一个 docker-compose 文件?

假设我有两个文件:

# docker-compose-1.yml
services:
    A:
        # config
    B:
        # config
# docker-compose-2.yml
services:
    C:
        # config
    import: docker-compose-1.yml

通过运行docker-compose -f docker-compose-2.yml up,我想启动容器A、B(在导入的文件中指定)和C。这可能吗,无需使用-f 参数链接两个文件?

【问题讨论】:

  • @EstebanGarcia 是的,这正是我想要的。看起来这没有发生,因为这个问题已经有将近 5 年的历史了......
  • 我有和你现在一样的要求,考虑编写一个通过遍历目录树递归组合 docker compose yamls 的编译器。你想出解决方案了吗?如果不是,我可能会分享我的,一旦像样的。
  • @jaaq 我做到了,遗憾的是,没有,如果你能分享你的解决方案,我会很高兴,一旦你实施它。

标签: docker docker-compose


【解决方案1】:

通过扩展

可以扩展或使用多个 docker-compose 文件及其服务,并将它们链接到一个文件中。您可以查看this link 以了解多个撰写文件的其他用法。但是,如果不将相关文件链接在一起,您就无法包含该文件。

在这里,我定义了一个 common-services.yaml:

version: '2'
    services:
    nginx_a:
        image: nginx:latest
        container_name: nginx
        ports:
         - 81:80
         - 1443:443

然后,我创建了一个 docker-compose.yml 并包含了 common-services.yml 文件和它自己的服务。

services:
   nginx:
     extends:
         file: common-services.yml
         service: nginx_a

   nginx_b:
      image: nginx:latest
      container_name: nginx_b
      volumes:
      ports:
       - 82:80
       - 2443:443

通过 .env 技术

如果你想避免多个文件的链接使用,还有a technique 与 .env 文件。我将使用 .env 技术重写前面的示例。

COMPOSE_PATH_SEPARATOR=:
COMPOSE_FILE=common-services.yml:docker-compose.yml

让我们在 common-services.yml 中添加另一个服务作为示例

 version: '2'
 services:
   ngin_a:
     image: nginx:latest
     container_name: nginx_a
     ports:
       - 81:80
       - 1443:443

   redis_c:
     image: redis:latest
     container_name: redis_c
     ports:
       - 6381:6380

最后,将它们全部加载到 docker-compose 文件中,甚至无需提及这些服务。

version: '2'
 services:
   nginx_b:
     image: nginx:latest
     container_name: nginx_b
     ports:
       - 82:80
       - 2443:443
     env_file:
       - .env

最终,您将拥有三个正在运行的服务。

【讨论】:

  • 但是在公共文件中,我仍然需要声明每一个使用的服务,对吧?只有配置才会被实际外部化。
  • @OndraK。我刚刚用 .env 技术更新了答案,也许这个对你有用。但是如果没有这种技术,您需要的东西是不可能的。
  • .env 看起来很方便,但我不确定我是否理解正确。它似乎用于将 service 相关设置外部化。我真正需要的是包含与多个服务相关的组合,这就是我将它们分组在另一个组合文件中的原因。 env_file 是在特定服务下声明的,据我了解,它只能加载与该服务相关的属性。还是我弄错了?也就是说,我根本不想在docker-compose-2.yml中提及服务A和B。
  • @OndraK。希望这不仅仅是配置问题,我使用 .env 技术重写了前面的示例,并在我的笔记本电脑上对其进行了测试。您无需再次调用 docker-compose 文件中的先前服务。如您所见,我在 common-services 文件中定义了 Nginx 和 Redis 服务,我只是在 docker-compose 文件中使用它们,甚至没有调用这些服务。
  • 这在 docker-compose V3 上无效,但他们有重新评估它的问题 -> github.com/moby/moby/issues/31101
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多