澄清 docker-compose down with -p (--project) 和 -f (--file) 选项

Clarification of docker-compose down with -p (--project) and -f (--file) options

我有一个启动两个 docker-compose 项目的引导加载程序,带有命令行:

docker-compose.sh -p a -f project1.yml up -d
docker-compose.sh -p a -f project2.yml up -d

我正在使用项目,因此如果升级失败,引导加载程序可以回退到不同的项目。

up 命令按预期工作,启动 project1.yml 和 project2.yml 中的所有容器和网络,容器名称以“a_”为前缀。

但是,当我尝试执行以下命令时:

docker-compose.sh -p a -f project1.yml down

它会关闭两个项目中的所有容器和网络(即所有以“a_”为前缀的容器)。

project1.yml 和 project2.yml 之间没有交叉,每个都从不同的图像创建独特的容器。

我找不到任何有关结合“down”命令使用撰写文件和项目的文档。我对项目和合成文件的使用是否正确?

Compose 通常认为,无论它正在处理哪个 docker-compose -p 项目,docker-compose -f Compose 文件名 项目中的每个 容器。 Compose 不会跟踪容器来自哪个文件,只会跟踪它与哪个项目相关联,并且它无法按照您显示的方式对 Compose 项目中的部分文件进行操作。

这首先意味着这个序列实际上停止了一些容器:

# start the containers in project1.yml
docker-compose -p a -f project1.yml up -d

# stop those containers and replace them with different
# containers from project2.yml
docker-compose -p a -f project2.yml up -d

在你的最后一个命令中,第二批容器不在当前的 Compose 文件中,这就是 Compose 清理它们的原因:

docker-compose -p a -f project2.yml up -d

# delete the containers from project1.yml, plus
# all of the "unknown" containers from project2.yml
docker-compose -p a -f project1.yml down

您可以提供多个 docker-compose -f 选项,docker-compose up 将删除它不知道的容器(“正常”用例是从单个 docker-compose.yml 文件)。您可以将这些组合用于您的用例:

# start all the containers in both Compose files
docker-compose -p a -f project1.yml -f project2.yml up -d

# start all the containers in project2.yml
# and stop any container that's not there
# (implicitly, stop the containers from project1.yml)
docker-compose -p a -f project2.yml up -d

另一种方法是将它们视为两个单独的 Compose 项目,这样 docker-compose 操作将只作用于其中一个。缺点是这使得共享网络等详细信息变得更加棘手。

docker-compose -p a1 -f project1.yml up -d
docker-compose -p a2 -f project2.yml up -d

docker-compose -p a1 -f project1.yml down

作为一般规则,为了保持一致的行为,您希望将相同的 -p-f 选项传递给每个 docker-compose 命令,以免 Compose 意外删除您下面的容器。