在Windows Powershell中使用Docker运行TensorFlow Serving时遭遇文件找不到错误
看起来你在Windows PowerShell下用Docker部署TensorFlow Serving时,遇到了配置文件挂载失败的问题,我来帮你拆解原因并给出解决方案。
你遇到的NOT_FOUND: /api/models.config/; No such file or directory错误,本质是Docker没有正确把本地的models.config文件挂载到容器内指定的路径,再加上Windows下路径格式和Docker参数的一些细节没注意到,才导致了这个问题。
一、先修正Docker运行命令的关键问题
你的两个命令都存在几个典型的Windows Docker挂载误区,我来逐一修正:
错误点1:路径格式混淆(Windows vs 容器内路径)
Windows下Docker挂载本地文件/目录时,必须用Windows绝对路径(比如D:\Projects\Potato_disease\api\models.config),不能用Linux风格的根路径(比如你第一个命令里的/Potato_disease/);同时容器内的路径要用正斜杠/,不能用反斜杠。
错误点2:挂载文件时末尾多了斜杠
你第一个命令里的target=/api/models.config/加了末尾斜杠,Docker会把它当成目录来处理,但你实际要挂载的是文件,所以要去掉末尾斜杠,改成target=/api/models.config。
错误点3:参数和值之间有空格
第二个命令里的--rest_api_port = 3501有空格,这会被Docker当成两个独立参数,必须去掉空格改成--rest_api_port=3501。
错误点4:容器内不能直接访问Windows本地路径
第二个命令里的--model_config_file=D:\Projects\Potato_disease\api\models.config是Windows本地路径,但容器里根本没有这个路径,必须用容器内挂载后的路径,比如/potato_disease/api/models.config。
二、正确的Docker运行命令示例
假设你的本地项目结构是这样的:
D:\Projects\Potato_disease\ ├── saved_models\ │ └── potatoes_model\ │ ├── 1\ # 这里是你的模型版本目录 │ │ ├── saved_model.pb │ │ └── variables\ └── api\ └── models.config
那么正确的Docker命令应该是:
docker run -p 3501:3501 ` -v "D:\Projects\Potato_disease\saved_models:/models" ` -v "D:\Projects\Potato_disease\api\models.config:/api/models.config" ` tensorflow/serving ` --rest_api_port=3501 ` --model_config_file=/api/models.config
(PowerShell里用反引号`换行,方便阅读)
三、检查models.config的内容是否匹配
确保你的models.config里的模型路径是容器内的挂载路径,而不是本地路径,比如:
model_config_list: { config: { name: "potatoes_model", base_path: "/models/potatoes_model", # 对应容器内的/models目录 model_platform: "tensorflow" } }
四、验证挂载是否成功
如果还是有问题,可以进入容器检查文件是否存在:
- 先查看运行中的容器ID:
docker ps - 进入容器:
docker exec -it <你的容器ID> bash - 检查配置文件:
ls /api/,如果能看到models.config说明挂载成功;如果看不到,再检查本地路径和挂载命令的拼写。
最后,你的FastAPI代码看起来是没问题的,只要TensorFlow Serving服务正常启动,http://localhost:3501/v1/models/potatoes_model:predict这个端点就能正常接收请求了。
备注:内容来源于stack exchange,提问作者Ibrat Usmonov

