Python|Build FARM Stack App|3. Dockerize FastAPI

y
chenstraveler
Published in
4 min readDec 15, 2021
20140820 / 旭山動物園 / photo: chenstraveler

🚀 Build a Docker Image for FastAPI

接下來會基於official Python image,來建立一個FastAPI的Docker image。
大部分是在以下情況會需要建立docker image:

  • 使用Kubernetes或是其他類似工具
  • 需要在Raspberry Pi(樹莓派)上運行時
  • 想在雲服務上使用container image時

🚀 安裝套件

過去是寫成requirements.txt檔案,這次會使用poetry進行安裝。

fastapi>=0.68.0,<0.69.0
pydantic>=1.8.0,<2.0.0
uvicorn>=0.15.0,<0.16.0

情境1: 已透過poetry建立專案

Step1: 修改pyproject.toml,加上套件指定版本

Step2: 安裝套件

poetry install

Step3: 更新原有套件版本

poetry update package

Poetry套件會根據pyproject.toml指定版本內容,去做套件版本更新。

情境2: 尚未在專案中加入Poetry或還沒有開始專案

可參考之前這篇教學進行安裝:Python|Build FARM Stack App|1. Poetry

🚀 建立FastAPI & Dockerfile

Step1: 建立FastAPI code

  • 建立一個app資料夾
  • 加入一個空的檔案:__init__.py
  • 加入主程式:main.py

結構如下

.
├── app
│ ├── __init__.py
│ ├── main.py

Step2: 建立Dockerfile

ref: 官方document — Docker image with poetry

  • 分成兩個階段安裝
  • Stage 1: 安裝poetry & 根據pyproject.toml file生成requirements.txt
  • Stage 2:
    1) 根據stage1產出的requirements.txt安裝套件
    2) run FastAPI service
  • 最後只會留下Stage2的container image。

備註:官方document是由python:3.9下載(這邊配合專案改用3.8版本)

Behind a TLS Termination Proxy — Poetry(不一定要設定)

如果需要搭配TLS Termination Proxy (load balancer)服務(比如:Nginx o或者Traefik),可以加上”–proxy-headers”到指令中:

CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]

🚀 啟動container

Step1: docker build 建立docker image

docker build -t <image_name>:<tag> .

Step2: docker run 啟動container

docker run -it -p 8000:8000 --name <container_name> -v $PWD/mnt/:/data/ <image_name>:<tag>

Step3: 啟動完成

進入Swagger UI操作API:http://0.0.0.0:8000/docs

其他更多細節可參考官方文件

Docker Image with Poetry

--

--