You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 07:31:07