在CLI中使用多个Docker Compose配置文件时,是否需要在所有命令运行时指定这些文件?

在CLI中使用多个Docker Compose配置文件时,是否需要在所有命令运行时指定这些文件?,docker,docker-compose,Docker,Docker Compose,当将Docker Compose与多个配置文件(例如)一起使用时,我无法确定CLI中的所有命令是否都需要提及所有配置文件 例如,我有docker.compose.yml和docker.compose.dev.yml,我启动我的开发环境如下: docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d 如果我想在服务上运行命令,我可以使用: docker-compose web ls docker-compose -

当将Docker Compose与多个配置文件(例如)一起使用时,我无法确定CLI中的所有命令是否都需要提及所有配置文件

例如,我有docker.compose.yml和docker.compose.dev.yml,我启动我的开发环境如下:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
如果我想在服务上运行命令,我可以使用:

docker-compose web ls
docker-compose -f docker-compose.yml -f docker-compose.dev.yml run ls
或者我可以使用:

docker-compose web ls
docker-compose -f docker-compose.yml -f docker-compose.dev.yml run ls

这两个命令都可以工作,因此我不确定配置文件在构建后是否与容器相关联。

从我可以看出,如果希望在运行docker compose CLI命令时应用覆盖配置文件,则需要指定所有配置文件。

这可能并不总是显而易见的:问题中给出的示例(
docker-compose web ls
docker-compose-f docker-compose.yml-f docker-compose.dev.yml run ls
可能会运行无误(具体取决于您运行的命令),但docker-compose.dev.yml中的所有设置都不会应用。

下面是一个例子,说明这可能是一个问题:

  • 假设docker-compose.yml的所有设置都默认为生产环境,docker-compose.dev.yml将这些设置设置为一些安全的开发设置(这是一个可怕的环境设置,但可能其他设置也会有类似的问题)
  • 假设web是一个Django应用程序,它使用Django存储在CDN上存储静态文件
  • 运行
    docker compose run web python manage.py collectstatic
    时,文件将上载到生产地址,从而可能导致意外的生产更改
  • 考虑到所有这些,我建议将docker-compose.yml重命名为类似于docker-compose.base.yml的名称,因此运行
    docker-compose run web python manage.py collectstatic
    会导致缺少docker-compose.yml的错误


    替代设置注意事项:如参考的Compose文档所述,多个环境的替代设置是在docker文件中使用
    extends
    关键字。Rackspace开发了一个示例项目,它提供了使用此功能的一个很好的示例。

    虽然我相信我找到了答案(如下所示),但我仍然很好奇我是否按照Compose开发人员的意图使用此Compose“extending”功能。想法?关于正确使用Compose的extend功能的问题,有一种替代设置,其中使用
    extends
    关键字链接Compose配置文件。正如我在下面的回答中所指出的,Rackspace有一个很好的例子: