如何在Docker-Compose部署的Flask应用中配置Gunicorn
用Gunicorn替代Flask内置服务器部署Docker化Flask应用
要让Gunicorn接管Flask应用的请求处理,你需要修改以下3个文件的配置:
1. 修改Dockerfile
移除原有的ENTRYPOINT ["python"],因为我们要直接调用gunicorn可执行文件,而非通过python命令启动:
FROM python:3.9-slim-buster RUN apt-get update && apt-get install -y git python3-dev gcc \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt . RUN pip install --upgrade -r requirements.txt --no-cache-dir EXPOSE 5000 # 移除原ENTRYPOINT,允许直接指定gunicorn命令
2. 更新docker-compose.yml的web服务命令
将web服务的command替换为gunicorn启动命令,指定监听端口、工作进程数和Flask应用入口:
web: build: . depends_on: waitfordb: condition: service_completed_successfully ports: - 5000:5000 # 替换原command为gunicorn启动命令 command: gunicorn -w 4 -b 0.0.0.0:5000 /flask/app/server:app environment: MYSQL_HOST: ${MYSQL_HOST} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} MYSQL_DB: ${MYSQL_DB} volumes: - ./:/flask
参数说明:
-w 4:启动4个工作进程(可根据EC2实例CPU核心数调整,建议设置为核心数×2+1)-b 0.0.0.0:5000:让Gunicorn监听容器内所有网卡的5000端口,对应docker-compose映射的宿主机5000端口/flask/app/server:app:指定Flask应用位置,其中/flask/app/server是容器内server.py的路径,:app是server.py中定义的Flask实例对象名称
3. Server.py无需修改(可选优化)
你的Server.py代码可以保持不变,gunicorn会直接导入app对象并启动服务,if __name__ == '__main__'分支仅会在直接用python运行时触发,不影响gunicorn启动。若想更清晰,可保留该分支用于本地开发测试。
验证部署
修改完成后,重新构建并启动服务:
docker-compose up --build
访问EC2实例的公网IP:5000即可看到应用响应,此时流量已由Gunicorn处理。
内容的提问来源于stack exchange,提问作者Juan Cruz Alric Cortabarria
相关产品推荐
相关产品推荐

