我有一台机器,它的任何接口(包括环回接口)上都没有配置 ipv6 地址。此外,主机上的 /etc/hosts 不包含“localhost”的 ipv6 条目。

然而,有些在 Docker 容器中运行的应用程序无法启动并出现错误socker.error [Errno 97] Address family not supported by protocol。我将其缩小到以下行为

  • 该应用程序实质上进行了以下调用:socket.getaddrinfo(None, 8080, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE | socket.AI_ADDRCONFIG)
  • 它返回一堆addrinfos – (10, 1, 6, '', ('::', 8080, 0, 0)), (2, 1, 6, '', ('0.0.0.0', 8080)):第一个条目显然是 ipv6 版本的“0.0.0.0”
  • 应用程序尝试绑定到每个返回的地址/端口
  • 尝试监听时失败::,因为据我了解,没有配置 ipv6 地址的接口

环境/限制:

  • 应用程序是用 Python 2.7 编写的
  • 我无法控制源代码(好吧,这是 Python,所以从技术上讲,我可以控制,但仍然如此)
  • 我确实可以控制 docker daemon 的运行,如果它很重要的话
  • 我可以重新配置主机上的网络/操作系统,但整个“接口上没有 ipv6”的事情不在我的控制范围内
  • network=host容器以网络模式运行

奇怪的是,当我在主机上运行时python3 -c 'import socket; print(socket.getaddrinfo(None, 8080, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE | socket.AI_ADDRCONFIG))',我只得到这个:[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('0.0.0.0', 8080))],所以没有返回任何 ipv6 地址,但不知何故在容器内部套接字实现认为这::是可用的。

我该怎么做才能解决这个问题?

0

0