Docker for Mac下Python请求GCS模拟器IPv6报错如何强制走IPv4?
问题根因
你遇到的报错核心原因不是getaddrinfo patch失效,而是你使用的fake-gcs-server默认返回的可恢复上传地址直接使用了IPv6的未指定地址:::
- fake-gcs-server在容器内默认监听
::(IPv6所有地址),生成上传回调地址时会直接用监听地址作为host - GCS客户端拿到的上传目标直接是
https://[::]:4443/xxx,此时你强制用IPv4地址族解析IPv6原生地址,自然会触发地址族不支持的报错
修复方案
第一步:修改docker-compose.yaml配置,指定fake-gcs-server的对外暴露地址
在gcs服务下新增启动参数,强制指定服务对外提供的地址为docker-compose网络内的服务域名,同时指定监听IPv4地址:
gcs: image: fsouza/fake-gcs-server:latest container_name: fake-gcs-server ports: - 4443:4443 env_file: - ./.env # 新增以下配置 command: ["-scheme", "https", "-host", "0.0.0.0", "-port", "4443", "-external-url", "https://gcs:4443"]
参数说明:
-host 0.0.0.0:强制服务只监听IPv4地址,避免绑定IPv6的::-external-url https://gcs:4443:告诉服务所有生成的回调/上传地址都用这个域名,不会再返回::作为host
第二步(可选):优化原有IPv4强制逻辑
如果你还需要兜底避免其他场景的IPv6请求,可把原来的patch逻辑调整为优先处理IPv6原生地址的情况:
def getaddrinfoIPv4(host, port, family=0, type=0, proto=0, flags=0): print(f'running patched getaddrinfo') # 兜底处理原生IPv6地址的情况 if host == '::': host = 'gcs' return orig_getaddrinfo(host=host, port=port, family=socket.AF_INET, type=type, proto=proto, flags=flags)
改完后重启docker-compose服务即可正常访问。
内容的提问来源于stack exchange,提问作者yoyoyousei
相关产品推荐
相关产品推荐

