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

Docker容器访问Volume文件触发FileNotFoundError错误求助

问题根源

你的报错是两个配置错误共同导致的:

  • docker-compose的卷挂载配置完全错误,导致你要读写的/my-vol目录在容器内根本不存在,不管读还是写文件都会触发路径不存在的报错
  • Flask作为Web服务,运行时没有交互式终端,代码里的input()函数调用在容器环境下无法正常执行

修正方案

1. 修正docker-compose.yml配置

你之前的配置里,services层级的卷声明没有指定挂载路径,且顶层volumes声明的卷名和你要用的my-vol不一致,修正后的配置如下:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      # 格式为 卷名:容器内挂载路径,将my-vol卷挂载到容器内的/my-vol目录
      - my-vol:/my-vol
# 顶层声明当前项目用到的卷
volumes:
  my-vol: {}

如果你要复用之前手动执行docker volume create my-vol创建的存量卷,可以给卷配置加上external: true标识:

volumes:
  my-vol:
    external: true

2. 修正app.py代码

删除input()调用,改用Web服务常规的参数传递方式,比如从请求的Query参数中获取要写入的内容,修正后代码示例:

from flask import Flask, request
app = Flask(__name__)
@app.route('/api/hello')
def hello_world():
    return 'Hello, Docker!'
    

@app.route('/api/ask')
def ask():
    try:
        my_file=open("/my-vol/newfile.txt","r")
        old_content = my_file.read()
        print("原有内容:", old_content)
        # 从请求参数中读取要写入的内容,调用示例:http://127.0.0.1:5000/api/ask?content=测试写入内容
        new_string = request.args.get("content", "默认写入内容")
        new_file = open("/my-vol/newfile.txt", mode="w", encoding="utf-8")
        new_file.write(new_string)
        new_file.close()
        # 读取写入后的内容返回
        my_file = open("/my-vol/newfile.txt", "r")
        new_content = my_file.read()
        print("更新后内容:", new_content)
        return f"写入成功,当前文件内容:{new_content}"
    except IOError:
        # 首次访问文件不存在,创建文件写入初始内容
        new_file = open("/my-vol/newfile.txt", mode="w", encoding="utf-8")
        init_content = "文件创建成功\n"
        new_file.write(init_content)
        new_file.close()
        my_file = open("/my-vol/newfile.txt", "r")
        print("初始内容:", my_file.read())
        return f"首次访问,已创建文件,初始内容:{init_content}"
    finally:
        print("exit")

启动验证

修改完成后执行以下命令重新构建启动服务即可:

docker-compose up --build

启动后先访问http://127.0.0.1:5000/api/ask会自动创建文件,再访问http://127.0.0.1:5000/api/ask?content=自定义内容即可正常写入文件。


内容的提问来源于stack exchange,提问作者Alejandro Sánchez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:30:01