在Docker容器中用Python调用ns1labs/flame遇文件找不到错误
解决Docker容器启动子容器生成文件后读取不到的问题
问题根源
你遇到的FileNotFoundError核心原因是Docker SDK的路径上下文不匹配:
- 你的
container1通过docker-compose挂载了主机的./output到容器内的/output - 但调用
client.containers.run()时,volumes参数里的os.path.abspath(output_dir)是container1内部的路径(即/output),而Docker daemon运行在主机上,它无法识别容器内部的路径,导致flame容器实际上没有正确挂载到主机的输出目录,自然不会生成文件到container1能访问的路径。
修复方案
1. 传递主机侧的输出目录路径给container1
修改docker-compose.yml,把主机上的输出目录路径作为环境变量注入到container1:
services: container1: ... volumes: - /var/run/docker.sock:/var/run/docker.sock - ./output:/output environment: - HOST_OUTPUT_DIR=${PWD}/output # 传递主机当前目录下的output路径
2. 修改main.py中的卷挂载配置
在Python脚本中,使用环境变量获取主机侧的路径,作为flame容器卷挂载的源:
import os import docker # 省略server变量定义... flamethrower_command = [ server, "-q", "10", "-v", "0", "-t", "10", "-Q", "8194", "-l", "10" ] output_file = "flame.out.json" container_output_dir = "/output" output_path = os.path.join(container_output_dir, output_file) flamethrower_command += ["-o", output_path] try: # 获取主机侧的输出目录路径 host_output_dir = os.environ.get("HOST_OUTPUT_DIR") if not host_output_dir: raise ValueError("HOST_OUTPUT_DIR环境变量未设置") client = docker.from_env() container = client.containers.run( "ns1labs/flame", command=flamethrower_command, # 使用主机侧路径作为卷的源,挂载到flame容器的/output volumes={host_output_dir: {'bind': container_output_dir, 'mode': 'rw'}}, remove=True, network="host", # 可选:捕获容器日志,方便排查命令执行问题 detach=False, stdout=True, stderr=True ) # 检查文件是否存在后再读取 if os.path.exists(output_path): with open(output_path, 'r') as file: print(file.read().splitlines()) else: print(f"文件 {output_path} 不存在,检查flame容器是否正常执行") # 可选:打印flame容器的输出日志 # print("Flame容器输出:", container.decode('utf-8')) except Exception as ex: print(ex)
3. 额外排查点
- 确保
ns1labs/flame镜像的用户有写入/output目录的权限,可在挂载卷时指定user参数,或在命令前加sudo(如果镜像支持) - 验证
flamethrower_command中的server变量是否正确,参数是否符合flame工具要求,比如-o参数是否被正确识别为输出文件路径 - 先手动在主机上运行flame容器,确认能生成文件:
docker run --rm -v $(pwd)/output:/output ns1labs/flame <server参数> -q 10 -v 0 -t 10 -Q 8194 -l 10 -o /output/flame.out.json
内容的提问来源于stack exchange,提问作者noah
相关产品推荐
相关产品推荐

