澄清 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 意外删除您下面的容器。
我有一个启动两个 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 意外删除您下面的容器。