Files
FastapiAdmin/docker/backend/Dockerfile
T

66 lines
2.1 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================
# FastapiAdmin Backend Dockerfile
# ============================================
# 多阶段构建:第一阶段安装依赖,第二阶段运行应用
# 优化:移除 build-essential,多数包已有预编译 wheel
# ============================================
# 第一阶段:安装依赖
FROM python:3.10-slim AS builder
ENV TZ=Asia/Shanghai \
PIP_NO_CACHE_DIR=1
WORKDIR /build
# 复制依赖文件(利用 Docker 缓存层)
COPY ./backend/requirements.txt .
# 安装 Python 依赖(全部使用预编译 wheel,无需 gcc/build-essential
RUN pip install --no-cache-dir --only-binary :all: \
-r requirements.txt --target=/home/deps \
-i https://pypi.tuna.tsinghua.edu.cn/simple 2>/dev/null \
|| pip install --no-cache-dir \
-r requirements.txt --target=/home/deps \
-i https://pypi.tuna.tsinghua.edu.cn/simple
# 第二阶段:运行环境
FROM python:3.10-slim
LABEL maintainer="948080782@qq.com"
LABEL description="FastapiAdmin Backend Service"
LABEL version="1.0"
# Python 优化环境变量
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
PIP_NO_CACHE_DIR=1 \
TZ=Asia/Shanghai
# 创建非 root 用户和日志目录
RUN groupadd -r fastapiadmin && \
useradd -r -g fastapiadmin -u 1001 -m -s /sbin/nologin fastapiadmin && \
mkdir -p /home/logs && \
chown fastapiadmin:fastapiadmin /home/logs && \
chmod 755 /home/logs
WORKDIR /home
# 从构建阶段复制依赖(直接指定所有者,避免后续 chown)
COPY --from=builder --chown=fastapiadmin:fastapiadmin /home/deps /home/deps
ENV PYTHONPATH=/home/deps:$PYTHONPATH
# 复制应用代码(一步到位设置所有者,省去 chmod -R 耗时)
COPY --chown=fastapiadmin:fastapiadmin ./backend/ .
# 切换到非 root 用户
USER fastapiadmin
EXPOSE 8001
# 容器健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8001/common/health')" || exit 1
CMD ["python", "main.py", "run", "--env=prod"]