执行docker-compose down误关其他容器,如何排查?
docker-compose down时误关闭其他项目容器的原因与排查 我有两个API项目,分别位于/first_project/api和/another_project/api目录下,各自目录内都包含docker-compose.yml文件。
第一个项目的docker-compose.yml配置如下:
version: "3.9" services: api: image: custom_image_name container_name: first_project_api working_dir: /first_project/api ports: - 52148:5000 volumes: - /first_project/api:/first_project/api command: > bash -c " dotnet Api.dll && tail -f /dev/null " networks: - first_project_network networks: first_project_network: name: first_project_network driver: bridge
第二个项目的配置仅将所有first_project替换为second_project。但在任意一个API目录中执行docker-compose down命令时,另一个项目的容器也会被一并关闭。
问题根源在于Docker Compose的默认项目名规则:Compose默认以执行命令所在目录的名称作为项目标识。你的两个项目目录名都是api(分别位于/first_project/api和/another_project/api),因此执行docker-compose命令时,两个项目会被识别为同一个项目名api。
当执行docker-compose down时,Compose会根据项目名匹配所有关联的容器、网络等资源,导致两个项目的资源被同时清理。
1. 验证项目名冲突
执行以下命令查看运行中容器的Compose项目标签:
docker ps --filter "label=com.docker.compose.project" --format "table {{.Names}}\t{{.Labels}}"
你会看到两个容器的com.docker.compose.project标签值均为api,这就确认了项目名冲突的问题。
2. 解决方法
方法一:执行命令时指定项目名
通过-p参数为每个项目指定唯一标识:
# 第一个项目目录下执行 docker-compose -p first_project down # 第二个项目目录下执行 docker-compose -p second_project down
方法二:设置环境变量
在执行命令前设置COMPOSE_PROJECT_NAME环境变量,为当前会话指定项目名:
# 第一个项目目录下 export COMPOSE_PROJECT_NAME=first_project docker-compose down # 第二个项目目录下 export COMPOSE_PROJECT_NAME=second_project docker-compose down
方法三:在配置文件中指定项目名(推荐)
在每个项目的docker-compose.yml顶部添加name字段(需Docker Compose 1.28+版本支持):
# 第一个项目配置 name: first_project version: "3.9" services: # 原服务配置保持不变 ...
# 第二个项目配置 name: second_project version: "3.9" services: # 原服务配置保持不变 ...
配置后执行docker-compose down,Compose会自动使用配置中指定的唯一项目名,不会再出现混淆。
内容的提问来源于stack exchange,提问作者Ali EXE

