首页 文章

Docker中的Flask:Dockerfile构建和docker-compose中的不同相对导入

提问于
浏览
0

我有一个简单的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 用于开发:它共享app目录,因此它使应用程序能够以DEBUG模式运行:

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

    如上所述here,为了使相对导入工作,更容易的选择之一是指定模块的完全点缀名称到Gunicorn,如下所示:

    app.__init__.create_app()
    

    其他选项包括:

    • 将相对导入更改为 from mymodule import as_int 等表单 . 这仅在您的模块名称是唯一的情况下才有效 . 否则,您可以:

    • from mypackage.mymodule import as_int

相关问题