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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:37:26