我有一台机器,它的任何接口(包括环回接口)上都没有配置 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)
- 它返回一堆
addrinfo
s –(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
|