Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 12 additions & 22 deletions docker/backend/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,25 @@
# FastapiAdmin Backend Dockerfile
# ============================================
# 多阶段构建:第一阶段安装依赖,第二阶段运行应用
# 优化:移除 build-essential,多数包已有预编译 wheel
# ============================================

# 第一阶段:构建依赖
# 第一阶段:安装依赖
FROM python:3.10-slim AS builder

# 设置时区
ENV TZ=Asia/Shanghai
ENV TZ=Asia/Shanghai \
PIP_NO_CACHE_DIR=1

# 设置容器内工作目录
WORKDIR /build

# 安装编译依赖(部分包需要 build-essential)
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
&& rm -rf /var/lib/apt/lists/*

# 复制依赖文件(利用 Docker 缓存层)
COPY ./backend/requirements.txt .

# 安装 Python 依赖到指定目录
RUN pip install --no-cache-dir -r requirements.txt \
--target=/home/deps
# 安装 Python 依赖(全部使用预编译 wheel,无需 gcc/build-essential)
RUN pip install --no-cache-dir --only-binary :all: \
-r requirements.txt --target=/home/deps 2>/dev/null \
|| pip install --no-cache-dir \
-r requirements.txt --target=/home/deps

# 第二阶段:运行环境
FROM python:3.10-slim
Expand All @@ -38,21 +35,16 @@ ENV PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1 \
TZ=Asia/Shanghai

# 创建非 root 用户
# 创建非 root 用户和日志目录
RUN groupadd -r fastapiadmin && \
useradd -r -g fastapiadmin -u 1001 -m -s /sbin/nologin fastapiadmin

# 创建日志目录
RUN mkdir -p /home/logs && \
useradd -r -g fastapiadmin -u 1001 -m -s /sbin/nologin fastapiadmin && \
mkdir -p /home/logs && \
chmod 755 /home/logs

# 设置工作目录
WORKDIR /home

# 从构建阶段复制依赖
COPY --from=builder /home/deps /home/deps

# 设置 PYTHONPATH
ENV PYTHONPATH=/home/deps:$PYTHONPATH

# 复制应用代码
Expand All @@ -64,12 +56,10 @@ RUN chown -R fastapiadmin:fastapiadmin /home
# 切换到非 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/api/v1/health')" || exit 1

# 运行应用
CMD ["python", "main.py", "run", "--env=prod"]