我有一个具有以下结构的简单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
在Docker容器中构建应用程序:
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导入配置
ImportError:尝试相对导入,但没有已知的父包
答案 0 :(得分:0)
如here所述,要使相对导入起作用,较容易的选项之一是为Gunicorn指定模块的全点缀名称,如下所示:
app.__init__.create_app()
要使其正常工作的其他选择包括:
将您的相对导入更改为from mymodule import as_int
之类的形式。仅当模块名称唯一时,此方法才有效。否则,您可以:
from mypackage.mymodule import as_int