繁体   English   中英

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

[英]Flask in docker: different relative import in Dockerfile build and docker-compose

我有一个具有以下结构的简单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

DockerfileDockerfile容器中构建应用程序:

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 .构建映像docker build -t exampleapi . 并运行它抱怨的图像:

模块中第3行的文件“ / app / init .py”

从.config导入配置

ImportError:尝试相对导入,没有已知的父包

如前所述这里 ,使相对进口工作,比较容易的选项之一是指定模块Gunicorn,像这样的完全带点名称:

app.__init__.create_app()

使此工作正常进行的其他选项包括:

  • 将您的相对导入更改为类似于from mymodule import as_int的形式。 仅当模块名称唯一时,此方法才有效。 否则,您可以:

  • from mypackage.mymodule import as_int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM