Не удается получить доступ к конечным точкам при запуске приложения фляги внутри док-контейнера - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь докеризировать приложение фляги. Но получая приведенную ниже ошибку при попадании в любую конечную точку на http://127.0.0.1:5000/. Я правильно сопоставил порты из localhost в контейнер .

flask.cli.NoAppException flask.cli.NoAppException: при импорте «dsdp.wsgi» возникла ошибка ImportError:

Traceback (последний вызов был последним): файл «/ usr / local / lib / python3. 7 / site-packages / flask / cli.py ", строка 240, в файле locate_app import (имя_модуля) Файл" /var/www/dsdp/wsgi.py ", строка 4, из app.common.observer import ConfigPublisher, QueueSubscriber ModuleNotFoundError: Нет модуля с именем 'app'

Это структура внутри моего контейнера.

root@6c37b85d98cb:/var/www/dsdp# ls -ltr
total 32
-rw-rw-r-- 1 root root  135 Oct  4 07:55 uwsgi.local.ini
-rw-rw-r-- 1 root root  598 Oct  4 07:55 requirements.txt
drwxrwxr-x 5 root root 4096 Oct  4 07:55 config
-rw-rw-r-- 1 root root    0 Oct  4 07:55 __init__.py
-rwxrwxr-x 1 root root  175 Oct  7 17:14 entrypoint.sh
-rw-rw-r-- 1 root root  742 Oct  7 17:36 wsgi.py
drwxrwxr-x 7 root root 4096 Oct  7 17:43 app
-rw-rw-r-- 1 root root  614 Oct  7 17:45 Dockerfile.app.local

Переменная среды FLASK_APP:

root@6c37b85d98cb:/var/www/dsdp# echo $FLASK_APP 
wsgi.py

Внутри wsgi.py , я пытаюсь импортировать, как показано ниже

from app.common.observer import ConfigPublisher, QueueSubscriber
from app.common.utils.endpoints import register_blueprints

Эти вещи работают нормально, когда я запускаю приложение колбы локально. Но выдает ошибку выше, когда я запускаю в докере. У меня есть __ init __. Py внутри папки app .

Вот Dockerfile, который я использовал для создания образа.

Dockerfile. app.local:

FROM python:3.7
RUN mkdir -p /var/www/dsdp/
WORKDIR /var/www/dsdp/
COPY . /var/www/dsdp/
RUN pip3 install --no-cache-dir -r requirements.txt
COPY uwsgi.local.ini /etc/uwsgi.ini
EXPOSE 5000

Вот как я строю образ, используя docker-compose.yml

  workload_service:
    container_name: workload_container
    restart: always
    image: workload
    build: 
      context: ./dsdp
      dockerfile: Dockerfile.app.local
    depends_on:
        - postgres_service
    ports:
      - "5000:5000"
    environment:
        - FLASK_APP=wsgi.py
        - FLASK_DEBUG=1
        - CONFIG_PATH=config/local
        - FLASK_CONFIG=local
        - APP_NAME=WORKLOAD
        - PYTHONPATH=.
    command: flask run --host=0.0.0.0 --port 5000

Где я делаюошибка?

Ответы [ 2 ]

1 голос
/ 08 октября 2019

изменить вас from на:

from .app.common.observer

попытаться установить FLASK_APP в Dockerfile:

 ENV FLASK_APP dsdp.wsgi:app
 ARG FLASK_APP=dsdp.wsgi:app

Из документов:

FLASK_APP = привет

The name is imported, automatically detecting an app (app) or factory (create_app).
1 голос
/ 08 октября 2019

99% (или, по крайней мере, в подавляющем большинстве) случаев, когда это происходит, потому что внутри контейнера используется 127.0.0.1:5000. Это было бы localhost внутри контейнера. Это не то же самое, что localhost за пределами контейнера (в хосте).

Исправление заключается в привязке к (установите host= в) 0.0.0.0:5000 внутри контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...