You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker+GitHub Actions的CI/CD中配置Django环境变量及本地部署问题

解决Django DisallowedHost错误 & 环境变量配置指南

嘿,我来帮你搞定这个问题!你的错误日志已经把问题点得明明白白——0.0.0.0没在ALLOWED_HOSTS里,同时你也需要优化环境变量的配置方式来隐藏敏感信息,下面一步步来:

一、先搞定DisallowedHost错误

1. 更新你的.dev.env配置

直接在ALLOWED_HOSTS里加上0.0.0.0就行,注意用逗号分隔:

DEBUG="True"
SECRET_KEY="...86hoe@14y6)en"
ALLOWED_HOSTS="localhost,127.0.0.1,[::1],0.0.0.0"  # 新增0.0.0.0
DATABASE_HOST="postgres"
DATABASE_USER="postgres"
DATABASE_NAME="postgres"
DATABASE_PASSWORD="postgres"

2. 让docker-compose自动加载.env文件

你现在的docker-compose是手动写环境变量,既麻烦又容易泄露敏感信息。改成加载.dev.env文件就方便多了,修改你的docker-compose.yml:

version: "3.7"
services:
  postgres:
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust
    image: "postgres:12"
    networks:
      - internal
  web:
    build: "."
    container_name: identityservice
    depends_on:
      - postgres
    env_file:  # 加上这行,自动读取.dev.env里的变量
      - .dev.env
    ports:
      - 8000:8000
    networks:
      - internal
    stdin_open: true
    tty: true
    volumes:
      - "./src/:/app/"
networks:
  internal:

记得把原来web服务里手动写的environment配置删掉,避免变量冲突哦。

3. 让Django正确读取环境变量

你已经装了django-environ,现在要在settings.py里配置它来解析这些变量,这样Django才能识别ALLOWED_HOSTS的列表格式:
在settings.py最开头加上这段代码:

import environ

# 初始化环境变量解析器
env = environ.Env(
    DEBUG=(bool, False),  # 默认值False,类型是布尔
    ALLOWED_HOSTS=(list, []),  # 默认空列表,类型是列表
)

# 读取本地的.dev.env文件(只在开发环境用)
environ.Env.read_env('.dev.env')

# 替换原来的配置项
DEBUG = env('DEBUG')
SECRET_KEY = env('SECRET_KEY')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')  # 自动把逗号分隔的字符串转成列表

# 数据库配置也可以改成从环境变量读取,更规范
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': env('DATABASE_NAME'),
        'USER': env('DATABASE_USER'),
        'PASSWORD': env('DATABASE_PASSWORD'),
        'HOST': env('DATABASE_HOST'),
        'PORT': 5432,
    }
}

二、这样配置的好处

  • .dev.env:专门存开发环境的敏感信息,把它加到.gitignore里,就不用担心提交到GitHub泄露密钥啦。
  • docker-compose的env_file:不用在compose文件里硬编码变量,配置更干净,还能区分不同环境的.env文件(比如prod.env、dev.env)。
  • django-environ:帮你自动处理变量类型转换,比如把字符串"True"转成布尔值,把逗号分隔的字符串转成列表,省得你自己写代码处理。

三、验证一下修复效果

  1. 先停掉当前的容器:docker-compose down
  2. 重新构建并启动:docker-compose up --build
  3. 访问http://0.0.0.0:8000,应该就不会再看到DisallowedHost的错误啦!

内容的提问来源于stack exchange,提问作者Mert Alnuaimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:57:44