在Docker容器A内执行docker-compose down停止容器B报错:无资源可移除
有两个通过docker-compose启动的容器A和B,希望在容器A内执行docker-compose -f docker-compose.B.yaml down命令停止容器B。已尝试挂载容器B的docker-compose文件和/var/run/docker.sock,但在容器A内通过Python subprocess执行命令时出现错误。
Docker配置
services: Service A: image: imageA:rel_1.0.0 volumes: - /var/run/docker.sock:/var/run/docker.sock - /path/to/docker-compose.B.yaml:/projectA/docker-compose.B.yaml ...
Python代码
#docker-compose.py import subprocess compose_file_path = '/projectA_directory/docker-compose.B.yaml' command = f"docker-compose -f {compose_file_path} down" result = subprocess.run(command, shell=True, check=True, capture_output=True, text=True) logger.info(f"Command output: {result.stdout}") logger.error(f"Command error: {result.stderr}")
错误信息
ContainerA | ERROR | 2024-07-29T19:56:51-0600 | docker-compose.py:62 | Command error: Warning: No resource found to remove for project "projectA".
修正文件路径匹配问题:Docker配置中已将B的compose文件挂载到容器A的
/projectA/docker-compose.B.yaml,但Python代码里写的路径是/projectA_directory/docker-compose.B.yaml,路径不匹配导致找不到正确的配置文件。把Python中的compose_file_path改为/projectA/docker-compose.B.yaml。指定明确的项目名称:docker-compose默认以当前工作目录名称作为项目名,容器A内执行命令时的工作目录大概率和容器B启动时的目录不一致,导致项目名不匹配(错误提示中的"projectA"就是容器A内当前目录的名称)。执行命令时需通过
--project-name参数指定容器B的项目名:command = f"docker-compose -f /projectA/docker-compose.B.yaml --project-name <B的项目名> down"容器B的项目名可以通过
docker ps查看容器名称前缀(默认是目录名),或者启动B时是否指定了--project-name参数,需保持一致。确认容器A内已安装docker-compose:检查容器A的镜像是否包含docker-compose工具,若没有,需在镜像构建时添加安装步骤(比如
apt install docker-compose或pip install docker-compose)。检查docker.sock权限:确保容器A内的用户有权限访问
/var/run/docker.sock,可以在容器内执行ls -l /var/run/docker.sock查看权限,必要时启动容器A时添加--user root参数,或调整宿主机上docker.sock的权限。
内容的提问来源于stack exchange,提问作者Mitchell Matheny

