Dockerfile运行容器触发ModuleNotFoundError,无法加载hello模块求解决
问题分析与解决方案
你的问题根源非常清晰:Docker容器内部没有你的代码文件——你只在Dockerfile里安装了Python和Gunicorn,但完全没把本地的hello.py、requirements.txt等文件复制到容器中,Gunicorn找不到hello模块是必然结果。另外你设置的PYTHONPATH也完全无效,因为容器里对应的路径下根本没有任何代码。
修改后的Dockerfile
FROM python:3.6.7 # 设置容器内的工作目录为/app,后续操作默认在此路径下执行 WORKDIR /app # 先复制依赖文件,利用Docker缓存优化构建速度 COPY requirements.txt . RUN pip install gunicorn -r requirements.txt # 将本地当前目录的所有文件复制到容器的/app目录下 COPY . . EXPOSE 5000 # 直接运行gunicorn,此时工作目录是代码所在的/app,Python可直接找到hello模块 CMD ["gunicorn", "--bind", "0.0.0.0:5000", "hello:app"]
关键修改说明
- 添加
WORKDIR /app:指定容器内的工作目录,让后续的复制、命令执行都在统一路径下,避免路径混乱。 - 添加
COPY指令:- 先复制
requirements.txt是Docker构建的最佳实践——如果依赖没有变化,这一层会被缓存,不需要每次修改代码都重新安装依赖。 COPY . .把本地和Dockerfile同目录的所有文件(包括hello.py、__init__.py等)全部复制到容器的/app目录下,让容器里终于有了你的代码文件。
- 先复制
- 简化
CMD命令:因为工作目录已经是代码所在的/app,Python默认会把当前工作目录加入模块搜索路径,所以不需要额外设置PYTHONPATH,直接运行gunicorn hello:app即可。
验证步骤
- 用修改后的Dockerfile重新构建镜像:
docker build -t <your-image-name> . - 运行容器:
docker run -p 5000:5000 <your-image-name>
此时Gunicorn应该能正常加载hello:app,不会再出现ModuleNotFoundError了。
内容的提问来源于stack exchange,提问作者sagar mehta
相关产品推荐
相关产品推荐

