https://github.com/windvalley/fastapi-uvicorn-gunicorn-docker
Uvicorn managed by Gunicorn for high-performance FastAPI web applications in Python 3.8
https://github.com/windvalley/fastapi-uvicorn-gunicorn-docker
coroutine docker dockerfile fastapi gunicorn parallelism python38 uvicorn
Last synced: about 1 month ago
JSON representation
Uvicorn managed by Gunicorn for high-performance FastAPI web applications in Python 3.8
- Host: GitHub
- URL: https://github.com/windvalley/fastapi-uvicorn-gunicorn-docker
- Owner: windvalley
- License: mit
- Created: 2020-04-16T11:00:39.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2020-04-28T09:06:05.000Z (about 6 years ago)
- Last Synced: 2025-03-04T08:45:47.034Z (over 1 year ago)
- Topics: coroutine, docker, dockerfile, fastapi, gunicorn, parallelism, python38, uvicorn
- Language: Shell
- Homepage:
- Size: 12.7 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
项目说明
=======
## 文件结构说明
- Dockerfile
默认使用`Python3.8`作为基础镜像.
- app/main.py
项目的示例入口模块.
- app/prestart.sh
项目的示例预执行脚本, 在启动`fastapi`前执行的脚本.
- gunicorn_conf.py
`gunicorn`的配置文件, 使用将在下面介绍的环境变量进行配置, 并设置有默认值.
- start.sh
容器默认的启动命令, 用于生产环境.
- start-reload.sh
用于在开发环境下启动容器, 只会运行`uvicorn`, 不会启动`gunicorn`,
`gunicorn_conf.py`文件不起作用, 不过将在下面说明的环境变量都有效.
## 启动容器时可设置的环境变量说明
```
# Gunicorn要导入的python模块名称;
# 值为main对应容器内目录结构是/app/main.py;
# 值为app.main则对应容器内目录结构为/app/app/main.py;
# 默认为app.main优先, 如不存在则默认main.
MODULE_NAME="app.main"
# 项目代码入口文件main.py中的FastAPI实例的名称;
# 默认为app.
VARIABLE_NAME="app"
# 值默认是MODULE_NAME:VARIABLE_NAME, 可以根据实际情况自定义,
# 自定义值后会忽略MODULE_NAME和VARIABLE_NAME变量的定义.
APP_MODULE="app.main:app"
# 宿主机每个CPU开启几个worker, 默认是1, 如果宿主机只有一个cpu, 则将开启2个worker;
# 也可以自定义为浮点数, 比如0.5, 此时如果宿主机是4核cpu, 则只会开启2个worker.
WORKERS_PER_CORE="1"
# 这个变量值默认为WORKERS_PER_CORE变量值*宿主机cpu核数;
# 我们可以自定义这个变量值来定义一共开启多少个worker,
# 此时将忽略宿主机有多少核和WORKERS_PER_CORE变量.
WEB_CONCURRENCY=None
# 容器中Gunicorn监听的地址, 默认为0.0.0.0, 一般不用改.
HOST="0.0.0.0"
# 容器中Gunicorn监听的端口, 默认为80, 一般不用改.
PORT="80"
# 容器中Gunicorn监听的地址和端口, 默认值是HOST:PORT, 自定义后将忽略HOST和PORT变量的设置.
BIND="0.0.0.0:80"
# Gunicorn的日志等级, 默认是info, 全部等级依次为: debug info warning error critical
LOG_LEVEL="info"
# fastapi项目的预启动脚本的位置, 默认为容器中的/app/prestart.sh
PRE_START_PATH="/app/prestart.sh"
# 指定Gunicorn的配置文件, 如果不指定,
# 默认依次查找/app/gunicorn_conf.py、/app/app/gunicorn_conf.py、/gunicorn_conf.py(默认位置)
GUNICORN_CONF="/app/your_custom_gunicorn_conf.py"
```
环境变量使用方式举例:
`docker container run -d --name container_name -p80:80 -e WEB_CONCURRENCY="2" image_name`
使用说明
=======
## 构建基础镜像
```bash
git clone git@github.com:windvalley/fastapi-uvicorn-gunicorn-docker.git
cd fastapi-uvicorn-gunicorn-docker
docker image build -t fastapi:python3.8 .
docker image ls
```
## 基于基础镜像构建项目镜像
### 创建并进入到项目目录
```bash
mkdir opsapi && cd opsapi
```
### 创建项目的Dockerfile
```bash
cat > Dockerfile <<-EOF
FROM fastapi:python3.8
COPY ./app /app
EOF
```
或者跳过构建基础镜像的步骤, 直接从docker hub上引用该镜像:
```bash
cat > Dockerfile <<-EOF
FROM windvalley/fastapi-uvicorn-gunicorn:python3.8
COPY ./app /app
EOF
```
### 创建项目源代码目录
```bash
mkdir app
```
### 将fastapi项目代码放到app目录下
如果不放置项目代码, 容器内的`/app`下将是基础镜像提供的示例文件`main.py`和`prestart.sh`;
你的项目代码中的入口文件和预启动文件建议保持文件名`main.py`和`prestart.sh`,
否则你在启动容器时需要`-e`参数设置相关的环境变量.
### 构建项目镜像
```bash
docker image build -t opsapi:0.1 .
docker image ls
```
## 运行容器
### 生产环境下运行容器
```bash
docker container run -d --name opsapi \
-p 80:80 \
-e WEB_CONCURRENCY="6" \
opsapi:0.1
```
`fastapi`访问日志和错误日志写到宿主机上的如下目录:
```bash
docker container inspect opsapi -f '{{.Mounts}}'|cut -d' ' -f3
```
### 开发环境下运行容器
```bash
docker container run -d --name opsapi \
-p 80:80 \
-e LOG_LEVEL="debug" \
-v $PWD/app:/app \
opsapi:0.1 /start-reload.sh
```
查看`fastapi`访问日志和错误日志:
```bash
docker container logs opsapi
```
## 测试
浏览器分别访问:
```
localhost
localhost/docs
localhost/redoc
```
参考
===
https://github.com/tiangolo/uvicorn-gunicorn-docker
https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker