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
相关产品推荐
相关产品推荐

