Python fastapi docker-compose traefik demo

23 min read
#  main.py

from enum import Enum
from fastapi import FastAPI
from pydantic import BaseModel
import jieba
import jieba.analyse

app = FastAPI()


class Text(BaseModel):
    content: str


@app.post("/jieba/")
async def create_item(text: Text):
    tags = jieba.analyse.extract_tags(text.content, topK=10, withWeight=1)
    return list(map(lambda x: "#" + x[0], tags))


@app.get("/")
async def root():
    return "hello world"

dockerfile

# 引入python版本
FROM python:3.10.1

# 设置时间
RUN ln -sf /usr/share/zoneinfo/Asia/Beijing/etc/localtime

# 输出时间
RUN echo 'Asia/Beijing' >/etc/timezone

# 设置工作目录
WORKDIR /code

# 复制该文件到工作目录中
COPY ./requirements.txt /code/requirements.txt

# 禁用缓存并批量安装包(后面的链接是利用豆瓣源安装,速度会加快)
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 复制代码到工作目录
COPY . /code

# 放开端口
EXPOSE 8085

# 命令行运行,启动uvicorn服务,指定ip和端口(--reload:让服务器在更新代码后重新启动。仅在开发时使用该选项。)
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8085"]

docker-compose

version: "3"
services:
  web:
    build: .
    networks:
      - proxy
    restart: always
    container_name: jieba-server
    volumes:
      - ./data:/code/app
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.jieba.rule=Host(`test.abc.xyz`)"
      - "traefik.http.routers.jieba.entrypoints=websecure"
      - "traefik.http.routers.jieba.service=bark-service"
      - "traefik.http.services.jieba-service.loadBalancer.server.port=8085"

networks:
  proxy:
    external: true