usert4jju7
usert4jju7

Reputation: 1813

Python flask docker port mapping on Heroku

I am trying to deploy a dockerized flask app into Heroku.

I am constantly getting "Port in use by another program" everytime I deploy. I have no idea how to tackle this problem. Please could someone help?

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 

LOGS FROM 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)

The web page is rendered well from

Upvotes: 0

Views: 343

Answers (1)

v25
v25

Reputation: 7621

Try removing this line from the app:

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

or place it in the usual if block, which ensures it only runs the development server when launched with the python executable instead of gunicorn:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=port, debug=True)   

The way you have this positioned just now, it looks like heroku is launching the server with gunicorn (correctly) but then the dev server launches with app.runafterwards, which causes the 'port in use error'.

The tell-tale sign is that you see the usual dev server warning in the logs, despite the Procfile (again correctly) launching the app with gunicorn.

Upvotes: 1

Related Questions