Python flask docker Heroku 上的端口映射

Python flask docker port mapping on Heroku

我正在尝试将一个 dockerized flask 应用程序部署到 Heroku 中。

我每次部署时都不断收到“另一个程序正在使用的端口”。我不知道如何解决这个问题。请问有人可以帮忙吗?

DOCKERFILE

FROM python:3.8-slim-buster

ARG DEBIAN_FRONTEND=noninteractive

ENV TZ=Pacific/Auckland
RUN echo $TZ > /etc/timezone && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime

WORKDIR /app

COPY ./requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

ENTRYPOINT ["python3"]
CMD ["myapp.py"]

myapp.py

import os

import requests
import json
from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/')
def parse_data():
    bla bla
    return result

port = int(os.environ.get("PORT", 5000))
app.run(host='0.0.0.0', port=port, debug=True)  

Procfile

web: gunicorn myapp:app 

来自 HEROKU 的日志

2022-06-04T11:33:05.715431+00:00 app[web.1]: [2022-06-04 11:33:05 +0000] [1560] [INFO] Booting worker with pid: 1560
2022-06-04T11:33:05.721157+00:00 app[web.1]: * Serving Flask app 'myapp' (lazy loading)
2022-06-04T11:33:05.721175+00:00 app[web.1]: * Environment: production
2022-06-04T11:33:05.721202+00:00 app[web.1]: WARNING: This is a development server. Do not use it in a production deployment.
2022-06-04T11:33:05.721219+00:00 app[web.1]: Use a production WSGI server instead.
2022-06-04T11:33:05.721232+00:00 app[web.1]: * Debug mode: on
2022-06-04T11:33:05.724607+00:00 app[web.1]: Address already in use
2022-06-04T11:33:05.724627+00:00 app[web.1]: Port 4050 is in use by another program. Either identify and stop that program, or start the server with a different port.
2022-06-04T11:33:05.724800+00:00 app[web.1]: [2022-06-04 11:33:05 +0000] [1559] [INFO] Worker exiting (pid: 1559)

网页渲染良好

尝试从应用中删除这一行:

app.run(host='0.0.0.0', port=port, debug=True)  

或者将它放在通常的 if 块中,这确保它仅在使用 python 可执行文件而不是 gunicorn:

启动时运行开发服务器
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=port, debug=True)   

你刚才定位的方式,看起来 heroku 正在用 gunicorn 启动服务器(正确)但是随后开发服务器用 app.run 启动,这导致 'port in use error'.

tell-tale 标志是您在日志中看到通常的开发服务器警告,尽管 Procfile(再次正确)使用 gunicorn 启动应用程序。