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

当将Docker Compose与多个configuration文件一起使用(例如, 为了允许多个环境共享一个通用configuration文件 ),我无法弄清CLI中的所有命令是否需要提及所有的configuration文件。

例如,我有docker.compose.ymldocker.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 

这两个命令都起作用,所以我不确定configuration文件在构build后是否与容器相关联。

从我所知道的情况来看,如果要在运行docker-compose CLI命令时应用覆盖configuration文件,则需要指定所有configuration文件。

这可能并不总是显而易见的:在这个问题中给出的例子( docker-compose web lsdocker-compose -f docker-compose.yml -f docker-compose.dev.yml run ls )都可以在没有错误的情况下运行取决于你正在运行的命令), 但是docker-compose.dev.yml中的所有设置都不会被应用。

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

  1. 假设docker-compose.yml将所有设置默认设置为docker-compose.dev.yml将其设置为安全开发设置的生产环境(这是一个可怕的环境设置,但其他设置也可能有类似的问题)
  2. 假设web是一个Django应用程序,它使用django-storages在CDN上存储静态文件;
  3. 当运行docker-compose run web python manage.py collectstatic ,文件将被上传到生产地址,因此可能会导致意外的生产更改。

考虑到这一切,我build议将docker-compose.yml重命名为docker -compose.base.yml ,从而运行docker docker-compose run web python manage.py collectstatic将会丢失docker-compose.yml

备选设置的注意事项:多个环境的替代设置(如引用的Compose文档中所述)是在docker文件中使用extends关键字。 Rackspace开发了一个示例项目, 在Github上提供,它提供了一个很好的使用这个特性的例子。