Python|Build FARM Stack App|3. Dockerize FastAPI
Published in
4 min readDec 15, 2021
🚀 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