【问题标题】:Error trying to build docker for flask app尝试为烧瓶应用程序构建 docker 时出错
【发布时间】:2020-07-03 00:02:25
【问题描述】:

我正在尝试构建一个 docker 来运行烧瓶应用程序。我以前从来没有这样做过。我有烧瓶应用程序在本地工作。这是我的方法:

我的项目目录结构如下:

model.pkl  README.md          images/            static/
Dockerfile         flaskapp.py        requirements.txt   templates/

我可以通过运行 python flaskapp.py 来启动烧瓶应用程序,它会在我的浏览器中(本地)运行。

我想创建一个 Docker,这样其他机器就可以运行这个项目,而无需处理所有依赖项。为此,我做了以下工作:

  • 我在里面创建了一个 Dockerfile:
FROM python:3
COPY requirements.txt /tmp
COPY flaskapp.py /tmp
COPY model.pkl /tmp
COPY images /tmp
COPY static /tmp
COPY templates /tmp
WORKDIR /tmp
ADD flaskapp.py /
RUN pip install -r requirements.txt
CMD [ "python", "flaskapp.py" ]
  • 运行命令docker build -t python-barcode .

  • 那行得通,所以。我跑了docker run python-barcode。终端打印出* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit),但是没用,浏览器出现这个错误:

This site can’t be reached0.0.0.0 refused to connect.
Try:

Checking the connection
Checking the proxy and the firewall
ERR_CONNECTION_REFUSED

所以我做了一些挖掘,并将我的 Dockerfile 更新为这个(添加最后一行):

FROM python:3
COPY requirements.txt /tmp
COPY flaskapp.py /tmp
COPY model.pkl /tmp
COPY images /tmp
COPY static /tmp
COPY templates /tmp
WORKDIR /tmp
ADD flaskapp.py /
RUN pip install -r requirements.txt
CMD [ "python", "flaskapp.py" ]
CMD ["flask", "run", "--host", "0.0.0.0" ]
  • 然后再次运行docker run python-barcode,我得到这个错误:
Usage: flask run [OPTIONS]

Error: Could not locate Flask application. You did not provide the FLASK_APP environment variable.

For more information see http://flask.pocoo.org/docs/latest/quickstart/

我应该如何进行?

如果相关,我的flaskapp.py 看起来像这样:

model = load_learner('', 'model.pkl')

app = Flask(__name__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0

def classify(document):
    X = document
    y = model.predict(X)
   
    return y

class ReviewForm(Form):
    pred = TextAreaField('',[validators.DataRequired(),validators.length(min=1)])

@app.route('/')
def index():
    form = ReviewForm(request.form)
    return render_template('reviewform.html', form=form)

@app.route('/results', methods=['POST'])
def results():
    form = ReviewForm(request.form)
    if request.method == 'POST' and form.validate():
        sequence = request.form['pred']
        y = classify(sequence)
        return render_template('results.html',
        y = y)
    return render_template('reviewform.html', form=form)

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

编辑 1

现在我收到此错误:

[2020-07-03 00:29:51,222] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1988, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1641, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1544, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.8/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1639, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1625, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "flaskapp.py", line 94, in index
    return render_template('reviewform.html', form=form)
  File "/usr/local/lib/python3.8/site-packages/flask/templating.py", line 133, in render_template
    return _render(ctx.app.jinja_env.get_or_select_template(template_name_or_list),
  File "/usr/local/lib/python3.8/site-packages/jinja2/environment.py", line 930, in get_or_select_template
    return self.get_template(template_name_or_list, parent, globals)
  File "/usr/local/lib/python3.8/site-packages/jinja2/environment.py", line 883, in get_template
    return self._load_template(name, self.make_globals(globals))
  File "/usr/local/lib/python3.8/site-packages/jinja2/environment.py", line 857, in _load_template
    template = self.loader.load(self, name, globals)
  File "/usr/local/lib/python3.8/site-packages/jinja2/loaders.py", line 115, in load
    source, filename, uptodate = self.get_source(environment, name)
  File "/usr/local/lib/python3.8/site-packages/flask/templating.py", line 57, in get_source
    return self._get_source_fast(environment, template)
  File "/usr/local/lib/python3.8/site-packages/flask/templating.py", line 85, in _get_source_fast
    raise TemplateNotFound(template)
jinja2.exceptions.TemplateNotFound: reviewform.html

【问题讨论】:

  • 您是否在任何地方设置 FLASK_APP 环境变量?
  • 错误现在不同了jinja2.exceptions.TemplateNotFound: reviewform.html 检查模板,因为它抱怨没有找到。
  • 我想你可以再问一个问题,因为这个错误与docker无关?泊坞窗问题已解决;)
  • 我明白了,然后将flaskapp.py 复制到正确的路径ADD flaskapp.py /tmp,它应该可以工作。

标签: python docker flask pytorch jinja2


【解决方案1】:

每个 Dockerfile 只能有 CMD。所以很可能会被忽略。

CMD [ "python", "flaskapp.py" ]
CMD ["flask", "run", "--host", "0.0.0.0" ]

只需删除第二个,因为您已经监听了代码中的所有接口。

CMD [ "python", "flaskapp.py" ]

现在使用此命令运行 Docker 容器。

docker run -p 5000:5000 -it python-barcode

然后你就可以到达终点了

htpp://localhost:5000

【讨论】:

  • 在 docker 中运行时,他实际上并不需要监听所有接口,因为端口转发会解决这个问题......但是是的 :) 暴露端口的好答案:P
  • 我这样做了,但在浏览器上出现此错误:内部服务器错误服务器遇到内部错误,无法完成您的请求。要么服务器超载,要么应用程序出错。
  • 看看输出...你应该有一个回溯...
  • 这意味着来自应用程序端的错误,检查你的代码,或者检查docker日志docker logs -f container_nam,现在你的容器可以访问并且它响应客户端
  • 你可能是对的......自从我搞砸了这件事已经有一段时间了......但我可以相信......我认为它正在使用 localhost 从外部端口转发到内部端口。 ..但我完全可以相信我错了
【解决方案2】:

你需要将端口暴露给外部世界

docker run -p 8000:8000 python-barcode 这会将 docker 容器内的端口 8000 映射到 docker 容器外的端口 8000。

然后你可以在主机上去http://127.0.0.1:8000

您也可以将端口重定向到不同的端口

docker run -p 8000:9000 python-barcode 然后在主机系统上通过http://127.0.0.1:9000 访问它

【讨论】:

  • 运行此命令时出现同样的错误:用法:flask run [OPTIONS] 错误:找不到 Flask 应用程序。您没有提供 FLASK_APP 环境变量。
  • 去掉那一行...只需使用python my_app.py 位(尽管您可能需要['/bin/python','my_app.py']
  • 我对此感到困惑,你是什么意思?
  • 您需要让左侧是 Flask 服务的端口(实际上可能是 5000),右侧是您要公开的端口......摆脱CMD ['flask','run']行,只需使用CMD ['python', 'my_app.py']
  • 好的,我这样做了,现在又遇到了另一个错误。请参阅我的 og 帖子中的编辑 1。它说我没有位于模板文件夹中的reviewform.html。为什么会发生这种情况,因为我将它复制到 Dockerfile 中?
猜你喜欢
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多