部署Gunicorn+Flask应用至Cloud Run时遇ModuleNotFound错误
问题:Cloud Run部署Flask+Gunicorn服务出现ModuleNotFoundError
将基于Gunicorn的简易Python Flask API部署到Cloud Run时,始终抛出ModuleNotFoundError: No module named 'server'。本地通过Docker或docker-compose运行完全正常,部署到Cloud Run初期无错误,但添加挂载Secret(路径/app/conf.json)和环境变量后调用服务时错误出现,暂无法确定二者是否相关。
Dockerfile内容
FROM python:3.10-slim RUN apt-get update && apt-get upgrade -y RUN pip install --upgrade pip # Copy local code to the container image. ENV APP_HOME /app ENV PORT 8080 WORKDIR $APP_HOME COPY requirements.txt requirements.txt # Install production dependencies. RUN pip install --no-cache-dir -r requirements.txt COPY app . CMD exec gunicorn --bind :$PORT --workers 1 --threads 4 server:app
文件夹结构
- database-api - app configuration.py util.py server.py Dockerfile requirement.txt cloudbuild.yaml
Cloud Build配置
steps: - name: 'gcr.io/cloud-builders/docker' args: - 'build' - '-t' - 'eu.gcr.io/$PROJECT_ID/database-api:$TAG_NAME' - '-f' - './Dockerfile' - '.' images: - 'eu.gcr.io/$PROJECT_ID/database-api:$TAG_NAME'
错误日志
Traceback (most recent call last): File "/usr/local/lib/python3.10/site-packages/gunicorn/arbiter.py", line 609, in spawn_worker worker.init_process() File "/usr/local/lib/python3.10/site-packages/gunicorn/workers/gthread.py", line 95, in init_process super().init_process() File "/usr/local/lib/python3.10/site-packages/gunicorn/workers/base.py", line 134, in init_process self.load_wsgi() File "/usr/local/lib/python3.10/site-packages/gunicorn/workers/base.py", line 146, in load_wsgiapp self.wsgi = self.app.wsgi() File "/usr/local/lib/python3.10/site-packages/gunicorn/app/base.py", line 67, in wsgi self.callable = self.load() File "/usr/local/lib/python3.10/site-packages/gunicorn/app/wsgiapp.py", line 58, in load return self.load_wsgiapp() File "/usr/local/lib/python3.10/site-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp return util.import_app(self.app_uri) File "/usr/local/lib/python3.10/site-packages/gunicorn/util.py", line 371, in import_app mod = importlib.import_module(module) File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked ModuleNotFoundError: No module named 'server'
已尝试的解决方案
- 修改文件路径配置
- 给Gunicorn添加
chdir参数 - 调整文件夹结构
- 使用
app.server作为模块名启动Gunicorn - 重建Cloud Run服务
- 更换Python版本及相关依赖包版本
- 重命名
server.py模块 - 在
app目录添加__init__.py - 验证文件路径正确且无文件丢失(无dockerignore/gitignore导致文件遗漏)
其他相同结构的项目可正常运行,官方指南也无相关问题说明,仅当前项目部署到Cloud Run后出现故障,求问问题根源及解决办法。
内容的提问来源于stack exchange,提问作者Kaloyan Kaloyanov
相关产品推荐
相关产品推荐

