【问题标题】:Cannot reach flask app in docker container无法访问 docker 容器中的烧瓶应用程序
【发布时间】:2018-03-21 05:44:24
【问题描述】:

我一直在尝试在 docker 容器中创建一个烧瓶应用程序。该应用程序在通过 Flask 开发服务器运行时可以完美运行,包括从网络上的其他机器访问网页。

我一直在尝试为应用程序构建一个 Docker 容器。问题是我无法访问任何网页。我收到 500 个错误。

我的一些设置:

运行.py

#!flask_v1/bin/python3
from app import app
app.run(debug=True, host='0.0.0.0')

其中 flask_v1 是 virtualenv 目录。

码头文件

FROM python:3.4
COPY . /site
workdir /site
RUN pip install -r requirements.txt
ENV NAME sitename
CMD ["python", "./run.py"]

我从这个版本中删除了 EXPOSE 5000,但它出现了同样的问题。它最初是放在 pip 线下的。

requirements.txt

click==6.7
CouchDB==1.1
docutils==0.14
Flask==0.12.2
Flask-CouchDB==0.2.1
flask-dynamo==0.1.2
Flask-Login==0.4.0
Flask-WTF==0.14.2
itsdangerous==0.24
Jinja2==2.9.6
jmespath==0.9.3
MarkupSafe==1.0
python-dateutil==2.6.1
PyYAML==3.12
s3transfer==0.1.11
six==1.11.0
Werkzeug==0.12.2
WTForms==2.1

然后我按如下方式运行构建命令(将 dockername 替换为实际名称):

docker build -t dockername .

构建完成,我运行镜像如下:

docker run -p 5000:5000 dockername

尝试在 localhost:5000/index(应用程序的“家”)连接到应用程序,或者只是 localhost:5000,或 127.0.0.1:5000/index,或 [host_ip]:5000/index,或[container_ip]:5000/index 都产生了同样的错误:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.4/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.4/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1610, in full_dispatch_request
    rv = self.preprocess_request()
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1831, in preprocess_request
    rv = func()
  File "/usr/local/lib/python3.4/site-packages/flaskext/couchdb.py", line 154, in request_start
    self.sync(current_app)
  File "/usr/local/lib/python3.4/site-packages/flaskext/couchdb.py", line 131, in sync
    if db_name not in server:
  File "/usr/local/lib/python3.4/site-packages/couchdb/client.py", line 96, in __contains__
    self.resource.head(name)
  File "/usr/local/lib/python3.4/site-packages/couchdb/http.py", line 549, in head
    return self._request('HEAD', path, headers=headers, **params)
  File "/usr/local/lib/python3.4/site-packages/couchdb/http.py", line 581, in _request
    credentials=self.credentials)
  File "/usr/local/lib/python3.4/site-packages/couchdb/http.py", line 289, in request
    conn = self.connection_pool.get(url)
  File "/usr/local/lib/python3.4/site-packages/couchdb/http.py", line 507, in get
    conn.connect()
  File "/usr/local/lib/python3.4/http/client.py", line 871, in connect
    self.timeout, self.source_address)
  File "/usr/local/lib/python3.4/socket.py", line 516, in create_connection
    raise err
  File "/usr/local/lib/python3.4/socket.py", line 507, in create_connection
    sock.connect(sa)
OSError: [Errno 99] Cannot assign requested address

在阅读了与此类似的其他一些 stackoverflow 问题后,我使用 -d 选项运行了容器,并按如下方式访问了容器:

docker exec -ti <container name> bash

进入后,我尝试使用 curl 和 wget 访问 localhost:5000/index。 Wget 刚刚抛出 500 个错误。 Curl 返回 Werkzeug 页面(参见上面的错误转储),包括所有 html 格式。 目录结构看起来不错

我知道我一定有一些配置不正确。我只是看不出它是什么。该应用程序在 Docker 之外运行,并且在 Docker 中一次也没有。我无法从容器内部访问该页面,这告诉我设置有问题,但我要么缺乏知识,要么有“树木为树木”的时刻。请帮助一个相对新手。

【问题讨论】:

  • 在你的 Dockerfile 中你需要EXPOSE 端口,然后将其映射到本地端口。
  • @blakev EXPOSE 不需要映射端口,更多的是用于记录图像将公开的端口
  • 可能是因为您无法连接到容器内的 couchdb。或者可能是因为您的 app.run 参数的顺序很奇怪。 app.run('0.0.0.0', 5000, debug=True)
  • Cannot assign requested address 看起来您正在尝试将服务器绑定到容器中不可用的特定 IP。您是否在应用中的某处配置了监听 IP 或主机名?
  • @Matt 是的。我在那里曝光,结果没有变化,所以至少在这种情况下它似乎没有效果。至于 IP,docker 和 flask 的所有示例都使用 0.0.0.0,就像许多没有 Docker 的 Flask 示例一样,因为它允许从 localhost 之外访问应用程序。 blakev 我将尝试重新排序参数,看看会发生什么。

标签: python docker flask


【解决方案1】:

如果您查看错误,首先这是一个应用程序异常。这意味着您在主机和容器内部的绑定都在工作。而且它与暴露的端口无关。

如果我们再看一下异常堆栈跟踪

File "/usr/local/lib/python3.4/site-packages/couchdb/http.py", line 289, in request
    conn = self.connection_pool.get(url)
  File "/usr/local/lib/python3.4/site-packages/couchdb/http.py", line 507, in get
    conn.connect()
  File "/usr/local/lib/python3.4/http/client.py", line 871, in connect
    self.timeout, self.source_address)

您正在连接到沙发数据库并且该地址不正确,这就是在这里引发错误的原因。错误OSError: [Errno 99] Cannot assign requested address有点误导,但这是因为您无法连接到可能配置错误或根本没有运行的Couch DB服务

【讨论】:

  • 谢谢。在马特的评论之后,我认为这可能与此有关,所以我在删除任何对沙发的调用后重建了容器。我使用的是本地的沙发实例,但我没有将它构建到容器中,也没有向容器提供有关如何到达它的任何说明。
  • 我的代表太低了,无法提高你的答案,但它是正确的,所以精神上 +1
猜你喜欢
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
相关资源
最近更新 更多