hekkaaa
@hekkaaa
Junior DevOps

Как корректно настроить в Docker compose — потоки в Flask сервере?

Привет.
Вожусь уже 2 день с docker compose.

Проблема в том что контейнер не стартует корректно.
На локальном компе моя схема работает. (не удивительно)
В docker запускаю тестовые функции обращающиеся к базе - все ок.

Проблема с запуском main.py.

При старте контейнера с сервером Flask ловлю следующее:

Exception in thread Thread-2:

Traceback (most recent call last):

File "/usr/local/lib/python3.9/threading.py", line 973, in _bootstrap_inner

self.run()

File "/usr/local/lib/python3.9/threading.py", line 910, in run

self._target(*self._args, **self._kwargs)

File "/server/start.py", line 20, in returnTradeHistory

check_table_db = chectablefromDB(name_table)

File "/server/DataFormatCorrection/UpdateData.py", line 203, in chectablefromDB

if connection:

UnboundLocalError: local variable 'connection' referenced before assignment


Либо

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/threading.py", line 973, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.9/threading.py", line 910, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 922, in run
    run_simple(t.cast(str, host), port, self, **options)
  File "/usr/local/lib/python3.9/site-packages/werkzeug/serving.py", line 1008, in run_simple
    inner()
  File "/usr/local/lib/python3.9/site-packages/werkzeug/serving.py", line 948, in inner
    srv = make_server(
  File "/usr/local/lib/python3.9/site-packages/werkzeug/serving.py", line 780, in make_server
    return ThreadedWSGIServer(
  File "/usr/local/lib/python3.9/site-packages/werkzeug/serving.py", line 686, in __init__
    super().__init__(server_address, handler)  # type: ignore
  File "/usr/local/lib/python3.9/socketserver.py", line 452, in __init__
    self.server_bind()
  File "/usr/local/lib/python3.9/http/server.py", line 138, in server_bind
    socketserver.TCPServer.server_bind(self)
  File "/usr/local/lib/python3.9/socketserver.py", line 466, in server_bind
    self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use


Я так примерно догадываюсь что ему не нравятся мои потоки в Flask.

Пример 1:
app = Flask(__name__)


@app.route('/')
def hello_world():
    return render_template('index.html')


flow1 = Thread(target=app.run)
flow2 = Thread(target=returnTradeHistory, daemon=True)

flow1.start()
flow2.start()


+ к этому перестает открываться web-морда по любому из адресов какие можно придумать.

Вариант где я прописываю в ручную порты и ip дает эффект работы web-морды, но увы не стартует flow2 автоматом. Даже на локальном компе. Просто стартует сервер, веб-морда и до демона в flow2 дело не доходит.
При запуске из консоли контейнера он так же не запускается с теми же ошибками что и выше.

Пример2 :
flow1 = Thread(target=app.run(host='0.0.0.0', port=5000, debug=True))
flow2 = Thread(target=returnTradeHistory, daemon=True)

flow1.start()
flow2.start()


Вопрос: Я уже не знаю куда конкретно копать.
Тут дело в контейнер на Debian который формирует docker-compose и потоки так не взлетят у него?
Или иная причина?

Убирать потоки не вариант. Мне нужен демон, а время бороться Celery у меня не очень много.
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
hekkaaa
@hekkaaa Автор вопроса
Junior DevOps
Проблема решена.
Подсказал решение shurshur
Нужно было в функции использующие connect определить переменную connection = None.

Проблему запуска потоков кешил указанием в докерфайле сборки сервера вместо RUN "python", "main" - RUN "flask","main".
При старте через python он занимал интерпретатор полностью не не давал запустить демона.

Сработает это при 2-3 демонах покажет время.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Dogrtt
Qt/Python разработчик
Собирай по ягодке – наберешь кузовок.
Ты больше времени в итоге потратишь на "костылирование", гарантирую.
Сядь, разберись с сельдереем, там нет абсолютно ничего сложного. Зато есть уверенность, что всё работает и в случае чего можно найти статьи/спросить совета у тех, кто уже с ним работал.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы