创建flask应用
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=["GET"])
def index():
return "hello world"
if __name__ == '__main__':
app.run()
启动flask服务器
Gunicorn(Green Unicorn)是一个基于Python的WSGI HTTP服务器,它能够处理并发连接,支持异步处理请求,通过工作进程池来提高性能,同时还能自动重启工作进程,保证系统稳定性。它是Python Web应用部署的常用工具之一
-b
绑定IP和端口号,如127.0.0.1:5001--access-logfile
日志--error-logfile
错误日志app:app
[模块名]:[在python代码中创建的flask实例名]
需要用nohup命令让gunicorn在后台运行
# 将nohup的日志和gunicorn的日志全部写到/app/log.txt中
nohup \
gunicorn -b 127.0.0.1:5001 \
--access-logfile /app/log.txt \
--error-logfile /app/log.txt \
app:app \
>> /app/log.txt 2>&1 &
把以上操作写到Dockerfile中统一管理
FROM python:alpine
WORKDIR /app
#把源码拷贝到容器里
COPY app.py /app
# 使用pipreqs自动生成requirements.txt
# --force Overwrite existing requirements.txt
RUN pip install gunicorn && \
pip install pipreqs && \
pipreqs . --encoding=utf8 --force && \
pip install -r requirements.txt
EXPOSE 5001
CMD ["nohup", "gunicorn", "-b", "0.0.0.0:5001","--access-logfile","/app/log.txt","--error-logfile","log.txt", "app:app", ">> /app/log.txt 2>&1", "&"]
构建容器并运行容器
set -e
# 删除之前的容器和镜像,还有日志文件
docker rm -f api
docker rmi -f api
rm -f log.txt
# 构建容器并创建日志文件进行挂载
docker build -t api .
touch log.txt
chmod 777 log.txt
# 启动容器
docker run -d \
--name api \
-e TZ=Asia/Shanghai \
-v ${PWD}/log.txt:/app/log.txt \
--restart=always \
-p 5001:5001 \
api
常见问题
- 挂载文件或挂载目录不存在 解决办法:创建对应的文件,重新运行
- 挂载的文件权限不对 解决办法:把挂载的文件权限设置为777
- 运行报错 解决办法:用docker logs查看容器日志,或者查看挂载的日志文件