Docker Compose部署Flask+MySQL遇导入错误与uvicorn命令缺失求助
Flask + MySQL Docker Compose部署问题排查
问题1:Docker构建后无法导入'hello'模块
- 排查Dockerfile的工作目录与文件复制逻辑:
- 确认
WORKDIR设置的路径(比如/app),后续的COPY命令是否把本地的hello.py、db_module.py都复制到了该目录下。如果COPY路径错误,容器内找不到目标文件,必然触发导入错误。建议用COPY . .复制当前目录下所有必要文件(前提是本地目录结构无多余无效文件)。
- 确认
- 检查容器内的Python路径:
- 容器默认PYTHONPATH可能未包含当前工作目录,可在Dockerfile中添加
ENV PYTHONPATH=/app,或者启动时用python -m hello代替python hello.py,强制Python从模块路径查找文件。
- 容器默认PYTHONPATH可能未包含当前工作目录,可在Dockerfile中添加
- 验证容器内文件是否存在:
- 执行
docker exec -it <容器ID> ls /app,查看容器内是否存在hello.py和db_module.py,确认文件已被正确复制。
- 执行
问题2:提示“No such command 'uvicorn'”
- 检查Dockerfile的命令执行顺序:
- 必须先执行
RUN pip install -r requirements.txt安装依赖,再编写服务启动命令。若先启动服务再装依赖,自然找不到uvicorn命令。
- 必须先执行
- 排查pip安装方式:
- 如果使用
pip install --user,uvicorn会被安装到用户目录的bin下(比如/root/.local/bin),该目录默认不在系统PATH中。要么去掉--user参数,要么在Dockerfile中添加ENV PATH="/root/.local/bin:$PATH"将该目录加入系统路径。
- 如果使用
- 确认requirements.txt的正确性:
- 检查是否存在拼写错误(比如把
uvicorn写成uvicornn)或版本号格式错误,导致pip未正确安装依赖。直接写uvicorn或指定版本(如uvicorn==0.23.2)均可。
- 检查是否存在拼写错误(比如把
- 改用模块方式启动uvicorn:
- 若仍找不到命令,可使用
python -m uvicorn hello:app代替uvicorn hello:app,通过Python模块路径查找uvicorn,避开PATH配置问题。
- 若仍找不到命令,可使用
修正后的Dockerfile示例
FROM python:3.9-slim WORKDIR /app # 先复制依赖文件,利用Docker缓存优化构建速度 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 再复制应用代码 COPY hello.py db_module.py . ENV PYTHONPATH=/app # 用模块方式启动uvicorn CMD ["python", "-m", "uvicorn", "hello:app", "--host", "0.0.0.0", "--port", "8000"]
修正后的docker-compose.yml示例
version: '3.8' services: web: build: . ports: - "8000:8000" depends_on: - db environment: - DB_HOST=db - DB_USER=root - DB_PASSWORD=your_db_password - DB_NAME=your_db_name db: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORD=your_db_password - MYSQL_DATABASE=your_db_name volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:
内容的提问来源于stack exchange,提问作者SeungHwan
相关产品推荐
相关产品推荐

