如何使用CircleCI将Docker化Django+uWSGI+Nginx应用部署到Google App Engine
问题核心原因
你遇到的500错误和配置失效问题,本质是三个核心逻辑不匹配导致的:
- GAE Python39标准运行时不支持多容器docker-compose架构,你本地用docker跑app+Nginx双容器,但GAE标准环境只会按app.yaml启动单Python进程,完全不会读取你的docker-compose配置
- app.yaml配置完全不符合GAE运行要求:uwsgi启动的是socket协议服务,而GAE要求入口进程必须监听
$PORT环境变量对应的端口,且直接处理HTTP请求,协议不匹配直接导致请求不通 - CircleCI里运行docker-compose生成的静态文件存在Docker volume中,不会被带到后续GAE部署步骤,静态资源路径不匹配也会触发Django报错
修复方案
方案1:改用GAE标准环境(推荐,成本低运维少)
直接去掉docker-compose相关逻辑,适配GAE标准运行时规则:
- 调整
app.yaml配置:
runtime: python39 entrypoint: gunicorn -b :$PORT --chdir app/ app.wsgi:application env_variables: SECRET_KEY: 请替换为你生成的正式密钥,可存储在CircleCI环境变量中注入 ALLOWED_HOSTS: .appspot.com # 替换为你的GAE自定义域名也可 DEBUG: "False" handlers: - url: /static static_dir: static/ - url: /.* script: auto
- 调整
requirements.txt,加入gunicorn、whitenoise依赖,用whitenoise处理静态资源更适配serverless环境 - 修改Django的
settings.py,中间件加入whitenoise配置,静态文件输出路径改为项目根目录的static文件夹:
STATIC_ROOT = BASE_DIR / 'static' STATIC_URL = '/static/' MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', # 加在security中间件后面 # 其他中间件保持不变 ]
- 简化
CircleCI/config.yml,删掉所有docker-compose相关步骤,修改为:
version: 2.1 workflows: version: 2 build_and_deploy_workflow: jobs: - build_and_deploy_job: filters: branches: only: master jobs: build_and_deploy_job: docker: - image: google/cloud-sdk steps: - checkout - restore_cache: key: deps1-{{ .Branch }}-{{ checksum "requirements.txt" }} - run: name: 安装Python依赖 command: | apt update && apt install -y python3-pip pip3 install -r requirements.txt - save_cache: key: deps1-{{ .Branch }}-{{ checksum "requirements.txt" }} paths: - "/usr/local/lib/python3.9/dist-packages" - run: name: 收集静态文件 command: | python3 app/manage.py collectstatic --no-input - run: name: 部署到App Engine command: | echo ${GCLOUD_SERVICE_KEY} > /tmp/sa_key.json gcloud auth activate-service-account --key-file=/tmp/sa_key.json rm /tmp/sa_key.json gcloud config set project [你的项目ID] gcloud config set compute/region [你的区域] gcloud app deploy app.yaml -q
方案2:保留docker-compose架构,改用Cloud Run部署
如果必须保留现有双容器架构,放弃GAE标准环境,改用Cloud Run部署:
- 在CircleCI中添加步骤,将构建好的app、proxy镜像推送到Google容器镜像服务GCR
- 用
gcloud run deploy命令分别部署两个服务,配置VPC内网通信,或者直接将Nginx和uWSGI打包到同一个镜像中部署 - 调整
ALLOWED_HOSTS为Cloud Run的服务域名
快速排查技巧
如果修改后仍然报错,直接访问GAE控制台的「日志浏览器」,筛选对应服务的错误日志,可直接看到具体是ALLOWED_HOSTS拦截、端口监听错误还是依赖缺失导致的500。
内容的提问来源于stack exchange,提问作者CarlosSR
相关产品推荐
相关产品推荐

