У меня есть простое приложение 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: попытка относительного импорта без известного родительского пакета