Docker-compose无法找到Flask配置文件

时间:2019-01-29 09:56:09

标签: python docker flask docker-compose

我关注了this blog post from Pycharm,并尝试对我的Flask应用进行docker化。我的应用程序可以在本地venv上正常运行。但是当我在终端中使用docker-compose up时。我收到此错误:

  

FileNotFoundError:[错误2]无法加载配置文件(无此类文件或目录):'/CarrotApp/project/instance/flask.cfg'

Screenshot

我从博客文章中复制了与docker相关的文件,仅做了最小的更改:

Dockerfile:

FROM python:3.6

EXPOSE 5000

RUN mkdir /app
WORKDIR /app

COPY requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt

COPY . /app

CMD python run.py

docker-compose.yml

version: '2'
services:
  web:
    build: .
    ports:
    - "5000:5000"

docker-compose.dev.yml

version: '2'

services:
  web:
    volumes:
      - .:/app

我的应用程序结构:

  
      
  • 项目      
        
    • / app(由Dockerfile创建)
    •   
    • /实例      
          
      • flask.cfg
      •   
    •   
    • / venv
    •   
    • __init__.py
    •   
  •   
  • run.py
  •   
  • requirements.txt
  •   
  • Dockerfileyml文件
  •   

run.py

from project import app

if __name__ == "__main__":
    app.run(host='0.0.0.0')

我的__init__.py中的烧瓶配置:

app = Flask(__name__, instance_relative_config=True,
            instance_path='/CarrotApp/project/instance')
app.config.from_pyfile('flask.cfg')

我必须为实例使用绝对路径,因为Flask仅允许这样。

我是Docker的新手,不知道哪里出了问题。

编辑:根据@andre_vieira的答案更改了yml文件。添加了完整错误消息的屏幕截图

1 个答案:

答案 0 :(得分:3)

您是说docker文件位于app文件夹中,并带有以下内容:

build: ./app

因此将其更改为:

build: .

这将消除以下情况:

Cannot locate specified Dockerfile

编辑:关于未找到配置文件。

我不能低估您在尝试什么,因为使用此行:

COPY . /app

您正在将所有文件复制到您的应用程序文件夹中。因此,在容器内的路径类似于:

app/project/app/ 
app/project/instance
app/run
app/Dockerfile and yml files (any you don't need, and you don't want this files inside the container. 

这是您要尝试的吗?

尝试“ ssh”到容器内部,并检查文件是否存在,并查看路径是否符合所需。

因为您说自己的应用和配置文件位于 / CarrotApp文件夹。但是您永远不会创建此文件夹。因此,尝试将init更改为:

app = Flask(__name__, instance_relative_config=True,
            instance_path='/app/project/instance')
app.config.from_pyfile('flask.cfg')

EDIT2:

要仅传递所需文件,请仅复制该文件:

COPY project /app
COPY run.py /app
COPY requirements.txt /app

或者只是将所有这些文件放在名为“ src”的文件夹或其他任何文件中,然后仅复制该文件夹:

COPY src /app

所以您的结构如下:

 yourproject/
    src/
       project
           /app (created by Dockerfile)
           /instance
               flask.cfg
           /venv
           __init__.py
       run.py
       requirements.txt
    Dockerfile and yml files