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
启动应用程序。
我正在尝试将一个 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
启动应用程序。