EC2上Docker-Compose启动Cookiecutter-Django时遇无效S3存储桶名错误
嘿,我碰到过类似的问题,你这个botocore.exceptions.ParamValidationError本质就是Django没读到DJANGO_AWS_STORAGE_BUCKET_NAME这个环境变量,导致传了个空字符串给AWS,触发了它的桶名校验规则。结合你把Caddy换成Nginx的情况,咱们从这几个方向排查:
1. 先确认.env文件有没有被Docker Compose正确加载
Cookiecutter-Django的production.yml默认会从项目根目录的.env读变量,但如果文件位置不对或者compose配置改漏了,就会读不到:
- 先检查
.env是不是和production.yml在同一个文件夹里 - 可以临时修改django服务的命令,验证变量是否加载:
然后跑django: # 其他配置不动,把command改成这个 command: printenv DJANGO_AWS_STORAGE_BUCKET_NAMEdocker-compose -f production.yml run django,如果输出是空的,说明env没加载上,得确保compose里有env_file配置:services: django: env_file: - .env # 其他配置不变
2. 检查.env文件的格式有没有坑
有时候.env的语法错了,变量就读不出来:
- 变量定义别加空格!比如
DJANGO_AWS_STORAGE_BUCKET_NAME=pulsemanager(等号前后不能有空格) - 变量值别加引号,除非是要转义特殊字符
- 看看变量行是不是被
#注释掉了,不小心加了注释就凉了
3. 确认换Nginx没影响环境变量传递
你替换Caddy为Nginx的时候,得确保django服务的env配置没被改丢:
- 检查production.yml里django服务的
env_file或者environment块是不是完整保留了 - Nginx服务的配置别干扰到django的环境变量传递逻辑
4. 检查Django配置里的变量引用有没有写错
看看settings/production.py里是不是用django-environ正确读的变量:
import environ env = environ.Env() AWS_STORAGE_BUCKET_NAME = env("DJANGO_AWS_STORAGE_BUCKET_NAME")
要是这里变量名拼错了,比如把DJANGO_AWS_STORAGE_BUCKET_NAME写成DJANGO_AWS_BUCKET_NAME,那肯定读不到值,变成空字符串。
5. 清缓存重新构建镜像试试
有时候旧镜像缓存里留着错误的配置,新的.env设置不生效:
docker-compose -f production.yml down -v docker-compose -f production.yml build --no-cache docker-compose -f production.yml up
要是以上步骤都试了还不行,可以先在production.yml的django服务里硬编码变量测试,确认是不是环境变量加载的问题:
django: environment: - DJANGO_AWS_STORAGE_BUCKET_NAME=pulsemanager
内容的提问来源于stack exchange,提问作者Brad Rhoads
相关产品推荐
相关产品推荐

