34 lines
1.1 KiB
Docker
34 lines
1.1 KiB
Docker
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"]
|