如何将Django应用Docker化部署至生产环境?解决构建失败问题
Django生产环境Docker化部署解决方案
一、解决psycopg2安装失败问题
报错核心原因是Alpine镜像缺少psycopg2编译所需的PostgreSQL开发依赖,提供两种解决方式:
方案1:编译安装psycopg2(生产环境推荐)
修改Dockerfile中的依赖安装命令,补充PostgreSQL开发库:
RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers postgresql-dev musl-dev \ && pip install -r /requirements.txt \ && apk del .tmp
方案2:使用预编译的psycopg2-binary(快速替代)
直接修改requirements.txt中的psycopg2条目:
psycopg2-binary>=2.9.3
注意:psycopg2-binary不保证与所有PostgreSQL版本完全兼容,生产环境优先选择方案1。
二、Dockerfile生产环境优化
调整镜像配置,满足安全性、性能要求:
FROM python:3.8-alpine ENV PATH="/scripts:${PATH}" COPY ./requirements.txt /requirements.txt # 安装编译依赖+生产环境系统依赖 RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers postgresql-dev musl-dev \ && pip install -r /requirements.txt \ && apk del .tmp \ && apk add --update --no-cache postgresql-client jpeg-dev zlib-dev RUN mkdir /app COPY ./Welzijn /app WORKDIR /app COPY ./scripts /scripts RUN chmod +x /scripts/* # 创建媒体/静态文件存储目录并收集静态文件 RUN mkdir -p /vol/web/media /vol/web/static \ && python manage.py collectstatic --noinput # 创建非root用户提升容器安全性 RUN adduser -D user RUN chown -R user:user /vol /app RUN chmod -R 755 /vol/web USER user CMD ["entrypoint.sh"]
三、docker-compose.yml生产环境配置
添加PostgreSQL数据库服务、Nginx反向代理,移除开发模式的本地代码挂载:
version: "3.9" services: app: build: context: . volumes: - static_volume:/vol/web/static - media_volume:/vol/web/media environment: - DEBUG=0 - DB_HOST=db - DB_NAME=welzijn_db - DB_USER=welzijn_user - DB_PASSWORD=welzijn_pass env_file: - ./.env depends_on: - db command: uwsgi --socket :8000 --module Welzijn.wsgi --master --processes 4 --threads 2 db: image: postgres:14-alpine volumes: - postgres_data:/var/lib/postgresql/data/ environment: - POSTGRES_DB=welzijn_db - POSTGRES_USER=welzijn_user - POSTGRES_PASSWORD=welzijn_pass nginx: image: nginx:alpine ports: - "80:80" volumes: - static_volume:/vol/web/static - media_volume:/vol/web/media - ./nginx/conf.d:/etc/nginx/conf.d depends_on: - app volumes: postgres_data: static_volume: media_volume:
四、补充配置说明
- entrypoint.sh初始化脚本:用于等待数据库就绪并执行迁移,避免重复操作:
#!/bin/sh # 等待数据库服务就绪 until pg_isready -h "$DB_HOST" -U "$DB_USER"; do echo "Waiting for database connection..." sleep 2 done # 执行数据库迁移 python manage.py migrate --noinput # 启动uWSGI服务 exec "$@"
- Nginx反向代理配置:在
./nginx/conf.d/default.conf中添加规则:
server { listen 80; location /static/ { alias /vol/web/static/; } location /media/ { alias /vol/web/media/; } location / { uwsgi_pass app:8000; include uwsgi_params; } }
- requirements.txt优化:将维护停止的
django-dotenv替换为python-dotenv:
# 替换前 django-dotenv # 替换后 python-dotenv
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

