python - Docker 中的 Flask:Dockerfile build 和 docker-compose 中的不同相对导入
问题描述
我有一个具有以下结构的简单 Flask 应用程序:
|__app
| └── __init__.py
| └── config.py
└── docker-compose.yml
└── Dockerfile
这里的关键是__init__.py
import 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:尝试在没有已知父包的情况下进行相对导入
解决方案
如此处所述,为了使相对导入工作,更简单的选项之一是将模块的全点名称指定给 Gunicorn,如下所示:
app.__init__.create_app()
使这项工作的其他选择包括:
将您的相对导入更改为类似
from mymodule import as_int
. 这仅在您的模块名称是唯一的情况下才有效。否则,您可以:from mypackage.mymodule import as_int
推荐阅读
- python - 如何从羽毛字节对象读入数据帧
- sql - 需要帮助来理解下面的 oracle 代码
- python - Scipy 正弦拟合有错误的偏移量
- javascript - 从容器调用组件并根据父容器提供的输入参数呈现表单
- go - 安装 go 模块失败并显示“无效:模块包含 go.mod 文件,因此主要版本必须兼容”
- azure - 如何将 Azure 服务总线与事件中心集成?
- sql - SQL 中 AVG 函数后的重复行
- python - Tkinter 中的 ASCII 艺术与控制台中的不同
- python - Pandas Group-By 和 Sum 没有创建新的数据框
- sql - 获取最后一个可用条目