为何执行docker-compose stop会同时停止多个不同服务?
确认未遗漏手册基础内容,当前目录结构如下:
/home/user /foo1/bar1/docker/ Dockerfile docker-compose.yml /foo2/bar2/docker/ Dockerfile docker-compose.yml
其中/foo1/bar1/docker下的docker-compose.yml配置:
version: '3.9' services: foo1-bar1: build: context: . args: DOCKER_SERVER_ROOT_DIR: ${DOCKER_SERVER_ROOT_DIR} dockerfile: Dockerfile image: foo1-bar1:v1 container_name: foo1-bar1-v1
/foo2/bar2/docker下的配置与之类似,对应服务为foo2-bar2-v1。
已分别进入对应目录执行启动命令成功启动两个服务:
cd /foo1/bar1/docker/ docker-compose up -d [+] Running 1/1 ⠿ Container foo1-bar1-v1 Started cd /foo2/bar2/docker/ docker-compose up -d [+] Running 1/1 ⠿ Container foo2-bar2-v1 Started
但进入~/foo1/bar1/docker目录执行docker-compose stop时,同时停止了两个容器:
user@vm:~/foo1/bar1/docker$ docker-compose stop [+] Running 2/2 ⠿ Container foo1-bar1-v1 Stopped ⠿ Container foo2-bar2-v2 Stopped
明明两个服务的服务名、容器名、镜像名都不相同,为何会出现这种情况?
核心原因
Docker Compose默认会以当前所在目录的名称作为项目名,你的两个服务所在的目录都叫docker,所以它们被归为同一个Docker Compose项目。当你在其中一个docker目录下执行docker-compose stop时,Compose会操作该项目下的所有容器,导致两个服务被同时停止。
解决方案
可以通过以下几种方式解决:
启动时指定项目名:使用
-p参数为每个服务设置唯一的项目名,启动命令修改为:# 启动foo1-bar1服务 cd /foo1/bar1/docker/ docker-compose -p foo1-bar1 up -d # 启动foo2-bar2服务 cd /foo2/bar2/docker/ docker-compose -p foo2-bar2 up -d后续操作时也需要带上
-p参数,比如停止foo1-bar1服务:docker-compose -p foo1-bar1 stop在docker-compose.yml中配置项目名:在每个服务的
docker-compose.yml顶部添加name字段(Compose 1.28+版本支持),指定唯一项目名:# /foo1/bar1/docker/docker-compose.yml name: foo1-bar1 version: '3.9' services: # ... 原有配置内容# /foo2/bar2/docker/docker-compose.yml name: foo2-bar2 version: '3.9' services: # ... 原有配置内容这样启动和操作时无需额外参数,Compose会自动识别不同的项目。
修改目录名称:将其中一个
docker目录重命名为唯一名称,比如foo1-docker和foo2-docker,这样Compose默认的项目名就会不同,操作时不会互相影响。
内容的提问来源于stack exchange,提问作者IgorZ

