FROM python:3.10-slim

# 設置工作目錄
WORKDIR /app

# 配置國內鏡像源加速
RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources 2>/dev/null || \
    sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list 2>/dev/null || true

# 安裝系統依賴
RUN apt-get update && apt-get install -y \
    gcc \
    g++ \
    libpq-dev \
    poppler-utils \
    && rm -rf /var/lib/apt/lists/*

# 複製依賴文件
COPY requirements.txt .

# 安裝Python依賴
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 複製應用代碼
COPY . .

# 創建必要的目錄
RUN mkdir -p /app/uploads /app/logs

# 暴露端口
EXPOSE 8000

# 默認命令
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
  1. 選擇基礎鏡像

FROM python:3.10-slim

•	使用官方的 python:3.10-slim 作為基礎鏡像
•	這是一個精簡版 Debian + Python 3.10,體積比較小,適合做生產鏡像

  1. 設置工作目錄

WORKDIR /app

•	把容器裏的當前工作目錄設為 /app
•	後面的命令(比如 COPY . .、pip install 等)都會以 /app 為當前目錄執行

  1. 換 apt 的國內源(阿里雲)

RUN sed -i ‘s|deb.debian.org|mirrors.aliyun.com|g’ /etc/apt/sources.list.d/debian.sources 2>/dev/null ||
sed -i ‘s|deb.debian.org|mirrors.aliyun.com|g’ /etc/apt/sources.list 2>/dev/null || true

•	作用:把默認的 deb.debian.org 源替換成 mirrors.aliyun.com,下載系統包更快
•	前面優先改 /etc/apt/sources.list.d/debian.sources,如果這個文件不存在就會報錯,因此後面加了 || 再去改 /etc/apt/sources.list
•	2>/dev/null 把錯誤輸出丟掉,|| true 保證這條命令即使失敗也不會導致構建中斷

  1. 安裝系統依賴

RUN apt-get update && apt-get install -y
gcc
g++
libpq-dev
poppler-utils
&& rm -rf /var/lib/apt/lists/*

•	apt-get update:更新軟件包列表
•	apt-get install -y 安裝以下依賴:
•	gcc, g++:C / C++ 編譯器,很多 Python 三方庫(比如帶 C 擴展的)編譯時需要
•	libpq-dev:PostgreSQL 客户端開發庫,通常是給 psycopg2 等數據庫驅動編譯用的
•	poppler-utils:PDF 相關工具,比如 pdftotext,常用於 PDF 轉文本等
•	rm -rf /var/lib/apt/lists/*:清理 apt 緩存,減小鏡像體積

  1. 複製依賴清單並安裝 Python 依賴

COPY requirements.txt .

•	把宿主機當前目錄下的 requirements.txt 拷貝到容器的 /app/requirements.txt

RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

•	使用 pip 安裝 Python 依賴
•	--no-cache-dir:不保留 pip 緩存,減小鏡像體積
•	-r requirements.txt:按依賴文件安裝
•	-i https://pypi.tuna.tsinghua.edu.cn/simple:使用清華源,加速下載

這裏先 COPY requirements.txt 再 pip install,有一個好處:
只要 requirements 沒變,這一層會命中緩存,構建會很快。

  1. 拷貝項目代碼

COPY . .

•	把你本地項目目錄下的所有文件拷貝進容器 /app/
•	包括你的 app 代碼、配置文件等

  1. 創建必要目錄

RUN mkdir -p /app/uploads /app/logs

•	創建兩個目錄:
•	/app/uploads:通常用來存上傳文件
•	/app/logs:用來存日誌文件
•	-p 保證目錄不存在就創建,存在也不會報錯

  1. 暴露端口

EXPOSE 8000

•	聲明容器內服務使用的端口是 8000
•	只是一個聲明,真正對外映射端口還是要在 docker run 或 docker-compose 裏用 -p 8000:8000 之類來做

  1. 啓動命令(默認入口)

CMD [“uvicorn”, “app.main:app”, “–host”, “0.0.0.0”, “–port”, “8000”]

•	指定容器啓動時默認執行的命令:
•	uvicorn app.main:app:運行 Uvicorn,加載 app/main.py 裏的 app 對象(FastAPI / Starlette 應用)
•	--host 0.0.0.0:監聽所有網卡地址,外部才能訪問
•	--port 8000:使用 8000 端口

總結一下這份 Dockerfile 做了什麼?
1. 選了一個輕量級 Python 3.10 基礎鏡像
2. 換 apt 源為阿里雲,加快系統包下載
3. 安裝了編譯器、Postgres 開發包和 PDF 工具
4. 用清華源安裝 Python 依賴
5. 拷貝你的應用代碼,創建上傳和日誌目錄
6. 暴露 8000 端口
7. 用 Uvicorn 啓動 FastAPI 應用 app.main:app