- 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
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
mkdir opsapi && cd opsapi
cat > Dockerfile <<-EOF
FROM fastapi:python3.8
COPY ./app /app
EOF
或者跳过构建基础镜像的步骤, 直接从docker hub上引用该镜像:
cat > Dockerfile <<-EOF
FROM windvalley/fastapi-uvicorn-gunicorn:python3.8
COPY ./app /app
EOF
mkdir app
如果不放置项目代码, 容器内的/app
下将是基础镜像提供的示例文件main.py
和prestart.sh
;
你的项目代码中的入口文件和预启动文件建议保持文件名main.py
和prestart.sh
,
否则你在启动容器时需要-e
参数设置相关的环境变量.
docker image build -t opsapi:0.1 .
docker image ls
docker container run -d --name opsapi \
-p 80:80 \
-e WEB_CONCURRENCY="6" \
opsapi:0.1
fastapi
访问日志和错误日志写到宿主机上的如下目录:
docker container inspect opsapi -f '{{.Mounts}}'|cut -d' ' -f3
docker container run -d --name opsapi \
-p 80:80 \
-e LOG_LEVEL="debug" \
-v $PWD/app:/app \
opsapi:0.1 /start-reload.sh
查看fastapi
访问日志和错误日志:
docker container logs opsapi
浏览器分别访问:
localhost
localhost/docs
localhost/redoc