Docker部署本地Streamlit应用时遭遇AttributeError(NoneType对象无read属性)
Docker部署本地Streamlit应用时遭遇AttributeError(NoneType对象无read属性)
嘿,我来帮你排查这个问题!先看报错信息,问题出在streamlit_demo.py的第17行:fitz.open(stream=uploaded_file.read(), filetype='pdf'),这里的uploaded_file是None,所以调用.read()才触发了AttributeError。
一、核心代码逻辑修复
这个问题本质是你在用户还没上传文件的时候,就执行了读取文件的代码。Streamlit的st.file_uploader组件在用户未选择文件时,返回的就是None。你需要先判断文件是否上传成功,再执行后续的PyMuPDF操作。
修改你的streamlit_demo.py代码,加上判断逻辑:
import streamlit as st import fitz # 创建文件上传组件 uploaded_file = st.file_uploader("上传你的PDF文件", type="pdf") # 只有当文件上传成功时,才执行读取与处理逻辑 if uploaded_file is not None: # 这里调用read()就不会报错了 open_file = fitz.open(stream=uploaded_file.read(), filetype='pdf') # 把你的PDF处理代码放在这个代码块里 else: st.info("请先上传一个PDF文件哦")
二、Dockerfile的优化建议
看你的Dockerfile,有几个可以优化的地方,避免冗余和潜在问题:
- 你重复安装了依赖:先在虚拟环境里装了
requirements.txt,又用pip3 install -r requirements.txt装了一次,这会导致系统级Python也安装了这些依赖,完全没必要。 - 可以添加
--no-cache-dir参数减少镜像体积,加快构建速度。
优化后的Dockerfile示例:
FROM python:3.9-slim WORKDIR /app COPY . /app # 安装虚拟环境工具并创建虚拟环境 RUN pip install --no-cache-dir virtualenv && virtualenv env_streamlit # 激活虚拟环境并安装依赖 RUN /bin/bash -c "source env_streamlit/bin/activate && pip install --no-cache-dir -r requirements.txt" # 暴露Streamlit默认端口 EXPOSE 8501 # 健康检查保持不变 HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health # 启动命令保持不变 ENTRYPOINT ["env_streamlit/bin/streamlit", "run", "streamlit_demo.py", "--server.port=8501", "--server.address=0.0.0.0"]
验证步骤
- 先修改
streamlit_demo.py的代码逻辑,确保只有上传文件后才执行读取操作。 - 重新构建Docker镜像:
docker build -t streamlit-app . - 运行容器:
docker run -p 8501:8501 streamlit-app - 打开本地
http://localhost:8501,上传一个PDF文件,应该就不会报错了。
备注:内容来源于stack exchange,提问作者Thibaut
相关产品推荐
相关产品推荐

