Python 无法访问docker容器中的flask应用程序

Python 无法访问docker容器中的flask应用程序,python,docker,flask,Python,Docker,Flask,我一直在尝试在docker容器中创建一个flask应用程序。该应用程序在Flask开发服务器上运行时工作正常,包括从网络上的其他机器访问网页 我一直在尝试为应用程序构建一个Docker容器。问题是我无法访问任何网页。我有500个错误 我的一些设置: run.py 其中,flask_v1是virtualenv目录 dockerfile 我从这个版本中删除了EXPOSE 5000,但是现在它也出现了同样的问题。它最初被放置在pip线下 requirements.txt 然后我按如下方式运行build

我一直在尝试在docker容器中创建一个flask应用程序。该应用程序在Flask开发服务器上运行时工作正常,包括从网络上的其他机器访问网页

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

我的一些设置:

run.py 其中,flask_v1是virtualenv目录

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

requirements.txt 然后我按如下方式运行build命令(dockername替换为实际名称):

构建完成,我按如下方式运行映像:

docker run -p 5000:5000 dockername
docker exec -ti <container name> bash
尝试在localhost:5000/index(应用程序的“主页”)或localhost:5000或127.0.0.1:5000/index或[host\u ip]:5000/index或[container\u 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 run -p 5000:5000 dockername
docker exec -ti <container name> bash
docker exec-ti bash
进入后,我使用curl和wget尝试访问localhost:5000/index。Wget只抛出了500个错误。Curl返回Werkzeug页面(参见上面的错误转储),包括所有html格式。 目录结构看起来不错


我知道我一定是配置不正确。我就是看不出是什么。该应用程序在Docker外部工作,在Docker中不工作一次。我无法从容器内部访问页面,这说明设置不正确,但我要么缺乏诀窍,要么有“以木换树”的时刻。请帮助相关的新手。

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

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

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)

您正在连接到Coach DB,但该地址不正确,这就是抛出错误的原因。错误
OSError:[Errno 99]无法分配请求的地址
有点误导,但这是因为您无法连接到Dockerfile中配置错误或根本没有运行的Coach DB服务

,您需要将其映射到端口,然后将其映射到本地端口。@blakev
EXPOSE
不需要映射端口,这更多的是关于图像将要显示的端口的文档,可能是因为您无法在容器内连接到couchdb。或者可能是因为你的
app.run
参数的顺序很奇怪
app.run('0.0.0.0',5000,debug=True)
无法分配请求的地址看起来您试图将服务器绑定到容器中不可用的特定IP。你是否在应用程序的某个地方配置了侦听IP或主机名?@Matt yes。我在那个里曝光了,结果并没有变化,所以至少在这种情况下它似乎并没有效果。至于IP,docker和flask的所有示例都使用0.0.0.0,就像许多没有docker的flask示例一样,因为它允许从本地主机之外访问应用程序。blakev我将尝试重新排序参数,看看会发生什么。谢谢。在Matt发表评论后,我认为这可能与此有关,所以在删除对Coach的所有调用后,我重新构建了容器。我使用了coach的一个本地实例,但我没有将它构建到容器中,也没有给容器任何关于如何到达它的指示。我的代表太低,无法更新您的答案,但它是正确的,所以精神上是+1
docker exec -ti <container name> bash
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)