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

如何将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:

四、补充配置说明

  1. 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 "$@"
  1. 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;
    }
}
  1. requirements.txt优化:将维护停止的django-dotenv替换为python-dotenv:
# 替换前
django-dotenv
# 替换后
python-dotenv

内容的提问来源于stack exchange,提问作者mightycode Newton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:38:20