如何修改start.sh使uvicorn在指定目录执行以启动FastAPI服务?
问题描述
我的文件夹结构:App/ 下包含 CMD/audit-ledger/cryptoexplorer/ 目录,该目录内有 balanceAPI.py(已定义 app=FastAPI())和 start.sh 脚本。原本在 cryptoexplorer 目录下执行 start.sh 中的命令 uvicorn balanceAPI:app --reload 可正常启动服务,但构建 Dockerfile 后,脚本从 App 根目录运行,导致无法找到 balanceAPI.py 文件报错。我曾尝试在 start.sh 中 cd 到 cmd/audit-ledger/cryptoexplorer/ 目录执行命令,以及使用 uvicorn cmd.audit-ledger.cryptoexplorer.balanceAPI:app --reload 的方式,均未成功,请问应如何修改 start.sh 脚本?
解决方案
1. 修正路径大小写问题
Linux/Docker 环境对路径大小写敏感,你的目录是大写 CMD/,但之前尝试 cd 的是小写 cmd/,这会导致切换目录失败。修改 start.sh 为:
#!/bin/bash # 切换到正确的目标目录(注意CMD为大写) cd CMD/audit-ledger/cryptoexplorer/ # 启动服务 uvicorn balanceAPI:app --reload
2. 用绝对路径避免相对路径歧义
如果切换目录仍有问题,可在脚本中使用基于容器工作目录的绝对路径,确保可靠性:
#!/bin/bash # 假设Docker容器中App根目录挂载到/app/,需与Dockerfile的WORKDIR/COPY路径对应 TARGET_DIR="/app/CMD/audit-ledger/cryptoexplorer/" # 切换目录失败则直接退出脚本 cd "$TARGET_DIR" || exit 1 uvicorn balanceAPI:app --reload
3. 处理目录名的模块兼容问题
你的目录 audit-ledger 包含连字符,而 Python 模块名不允许有连字符,这是导致模块路径启动失败的核心原因。有两种解决方式:
- 方式一:重命名目录
将audit-ledger改名为audit_ledger,然后在start.sh中使用模块路径启动:
#!/bin/bash # 将App根目录加入Python模块搜索路径 export PYTHONPATH="${PYTHONPATH}:." uvicorn CMD.audit_ledger.cryptoexplorer.balanceAPI:app --reload
- 方式二:直接指定文件路径
不修改目录名,直接通过文件路径启动 uvicorn:
#!/bin/bash uvicorn "CMD/audit-ledger/cryptoexplorer/balanceAPI.py:app" --reload --app-dir .
内容的提问来源于stack exchange,提问作者Gourab Chakraborty
相关产品推荐
相关产品推荐

