Колба в докере: различный относительный импорт в сборке Dockerfile и сборке dockerfile - PullRequest
0 голосов
/ 15 октября 2018

У меня есть простое приложение Flask со следующей структурой:

|__app     
|  └── __init__.py
|  └── config.py
└── docker-compose.yml
└── Dockerfile

Ключ в том, что __init__.py импортирует config.py.Я использую docker-compose для запуска приложения в контейнере в режиме DEBUG, а конечным продуктом является контейнер, созданный исключительно из Dockerfile.

Файл __init__.py:

from flask import Flask

from .config import config


def create_app(config_name='development'):
    """Create the app."""
    app = Flask(__name__)
    app.config.from_object(config[config_name])

    @app.route('/', methods=['GET'])
    def index():
        return 'hello world' 

    return app

Dockerfile создает приложение в док-контейнере:

FROM python:3.6-alpine
COPY requirements.txt /
RUN pip install Flask gunicorn
COPY app/ /app
WORKDIR /app
EXPOSE 8000
CMD gunicorn --bind=0.0.0.0:8000 "__init__:create_app()"

docker-compose.yml используется для разработки: он разделяет каталог приложения, поэтому он позволяет приложению работать в режиме отладки:

version: '3'
services:
  svc1:
    build: .
    entrypoint:
      - flask
      - run
      - --host=0.0.0.0
    environment:
      FLASK_DEBUG: 1
      FLASK_APP: __init__.py
    ports: ['5000:5000']
    volumes: ['./app:/app']

В основной папке вы можете запустить приложение в режиме отладки с помощью docker-compose up --build -d и перейти к localhost: 5000 возвращает «hello world».

Но если вы создаете образ с помощью docker build -t exampleapi . и запустите образ, на который жалуется:

Файл "/app/init.py", строка 3, в модуле

из .config import config

ImportError: попытка относительного импорта без известного родительского пакета

1 Ответ

0 голосов
/ 15 октября 2018

Как уже упоминалось здесь , чтобы сделать относительный импорт работающим, один из более простых вариантов - указать полностью пунктирное имя модуля для Gunicorn, например:

app.__init__.create_app()

Другие варианты получения этой работы включают в себя:

  • Изменение относительного импорта в форму, подобную from mymodule import as_int.Это будет работать, только если имя вашего модуля уникально.В противном случае вы можете:

  • from mypackage.mymodule import as_int

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