在CLI中使用多个Docker Composeconfiguration文件时,是否需要指定所有命令运行?
当将Docker Compose与多个configuration文件一起使用(例如, 为了允许多个环境共享一个通用configuration文件 ),我无法弄清CLI中的所有命令是否需要提及所有的configuration文件。
例如,我有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
这两个命令都起作用,所以我不确定configuration文件在构build后是否与容器相关联。
从我所知道的情况来看,如果要在运行docker-compose CLI命令时应用覆盖configuration文件,则需要指定所有configuration文件。
这可能并不总是显而易见的:在这个问题中给出的例子( 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-storages在CDN上存储静态文件;
- 当运行
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上提供,它提供了一个很好的使用这个特性的例子。