FROM python:3.13-alpine ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PIP_NO_CACHE_DIR=1 WORKDIR /opt/rdgen # 先单独安装依赖,尽量复用 Docker 层缓存 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 拷贝项目源码 COPY . . # su-exec 用于在入口脚本中降权运行;创建非 root 用户与数据目录; # 预收集静态文件(WhiteNoise 直接由应用进程对外提供) RUN apk add --no-cache su-exec wget \ && adduser -D -u 1000 appuser \ && mkdir -p exe png temp_zips data static \ && sed -i 's/\r$//' docker-entrypoint.sh \ && chmod +x docker-entrypoint.sh \ && python manage.py collectstatic --noinput \ && chown -R appuser:appuser /opt/rdgen EXPOSE 8000 # 健康检查:业务根路径需要登录会 302,故检查专用的 /healthz HEALTHCHECK --interval=30s --timeout=5s --retries=3 \ CMD wget -q -O /dev/null http://127.0.0.1:8000/healthz/ || exit 1 ENTRYPOINT ["./docker-entrypoint.sh"] CMD ["gunicorn", "-c", "gunicorn.conf.py", "rdgen.wsgi:application"]