mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-09-21 04:46:26 +00:00
66 lines
2.1 KiB
Docker
66 lines
2.1 KiB
Docker
# ============================================
|
||
# 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"]
|