【问题标题】:tornado/graphlab Cannot assign requested address in dockertornado/graphlab 无法在 docker 中分配请求的地址
【发布时间】:2017-07-27 06:00:00
【问题描述】:

运行 gl.canvas.set_target('ipynb') 会在 docker 容器中引发以下异常。

即使gl.canvas.set_target('ipynb', port=28892) 28892 是一个开放端口,错误仍然保持不变。

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-257-3f215a521352> in <module>()
----> 1 gl.canvas.set_target('ipynb')

/opt/conda/envs/gl-env/lib/python2.7/site-packages/graphlab/canvas/utils.pyc in set_target(target, port)
    102             # and to preserve backwards compatibility/other use cases
    103             # (running a notebook exported to .py, for instance)
--> 104         _active_target = targets[target]()
    105 
    106     # track metrics on target

/opt/conda/envs/gl-env/lib/python2.7/site-packages/graphlab/canvas/target.pyc in __init__(self, port)
     25         self.state = graphlab.canvas.state.State()
     26         # TODO server is not necessary in static IPython/Jupyter Notebook
---> 27         self.server = graphlab.canvas.server.Server(self.state, port)
     28         # add data objects to left nav
     29         DataView = graphlab.canvas.views.data_objects.DataObjectsView()

/opt/conda/envs/gl-env/lib/python2.7/site-packages/graphlab/canvas/server.pyc in __init__(self, state, port)
     44 
     45         #Will raise exception if port cannot be bound
---> 46         self.__bind_socket(port)
     47 
     48     # methods

/opt/conda/envs/gl-env/lib/python2.7/site-packages/graphlab/canvas/server.pyc in __bind_socket(self, port)
     93     # Raises exception if socket cannot be bound on requested port
     94     def __bind_socket(self, port=None):
---> 95         sockets = tornado.netutil.bind_sockets(port,"localhost")
     96         self.__server.add_sockets(sockets)
     97         with self.__port_lock:

/opt/conda/envs/gl-env/lib/python2.7/site-packages/tornado/netutil.pyc in bind_sockets(port, address, family, backlog, flags, reuse_port)
    194 
    195         sock.setblocking(0)
--> 196         sock.bind(sockaddr)
    197         bound_port = sock.getsockname()[1]
    198         sock.listen(backlog)

/opt/conda/envs/gl-env/lib/python2.7/socket.pyc in meth(name, self, *args)
    226 
    227 def meth(name,self,*args):
--> 228     return getattr(self._sock,name)(*args)
    229 
    230 for _m in _socketmethods:

error: [Errno 99] Cannot assign requested address

它看起来更像是 docker/tornado 问题而不是 graphlab 问题,因为在主机中同样的命令可以工作。

我使用以下命令启动了我的 docker 容器:

sudo docker run -it -v /path/to/data:/root/data \
    -v ~/code/work/src:/root/src \
    -p 8888:8888 -p 28892:28892 company/graphlab \
    /bin/bash -c "source activate gl-env && jupyter notebook --notebook-dir=~/src --ip='*' --port=8888 --no-browser"

有没有办法找出这个端口以便我可以打开它或任何其他方法来解决这个问题?

【问题讨论】:

    标签: python sockets docker tornado graphlab


    【解决方案1】:

    编辑您的 /etc/hosts 文件(在容器内)以仅包含 1 个 localhost 的 IP 地址值可以解决我的问题。只有在正在运行的容器上编辑它才有效。在构建图像时对其进行编辑并不能解决问题。

    在从容器启动时,我的 /etc/hosts 有以下行:

    127.0.0.1   localhost
    ::1 localhost ip6-localhost ip6-loopback
    

    我不得不将它们更改为:

    127.0.0.1   localhost
    ::1 ip6-localhost ip6-loopback
    

    【讨论】:

    • 对我不起作用,仅将错误更改为 [E 18:57:11.874 NotebookApp] 代理请求 Traceback 时未捕获的错误(最近一次调用最后一次):文件“/usr/local/lib /python2.7/dist-packages/jupyter_http_over_ws/handlers.py”,第 143 行,on_message response.rethrow() 文件“/usr/local/lib/python2.7/dist-packages/tornado/httpclient.py”,第 652 行,重新抛出引发 self.error 错误:[Errno 111] Connection denied 知道为什么吗?
    【解决方案2】:

    ForcaeLuz 的另一个答案是走上正轨,但只是治标不治本。

    似乎它最近在 Tornado 中的 this commit 中得到了修复,在那里查看 cmets 非常有用(例如,Docker 的默认配置是如何产生这种情况的)。

    在某些系统上(尤其是具有默认配置的 docker),ipv6 被部分禁用:socket.has_ipv6 为 true,我们可以创建 AF_INET6 套接字,并且 getaddrinfo("localhost", ..., AF_PASSIVE) 解析为 ::1 ,但绑定时出现错误。

    它尚未发布(截至撰写本文时),但可以让它从其主分支安装龙卷风,例如通过运行

    pip install --upgrade git+https://github.com/tornadoweb/tornado.git@master#egg=tornado
    

    (或类似的),或等待(我认为)应该包含此更改的版本 6.1.0。尝试了其他一些在底层使用 tornado 的项目,但在 Docker 中遇到了问题,之后一切都很好。

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 2023-01-05
      相关资源
      最近更新 更多