You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用socat替代curl通过Unix域套接字访问Docker Engine API时出现500错误的排查求助

socat替代curl通过Unix域套接字访问Docker Engine API时出现500错误的排查求助

问题原因分析

从你提供的Docker daemon panic日志(index out of range [0] with length 0)和调用栈来看,这个问题的核心是旧版本Docker daemon存在的一个bug:当处理不包含User-Agent请求头的API调用时,getContainersJSON辅助函数会尝试访问一个空数组的索引0,直接触发panic并返回500错误。

而你用curl能正常工作的原因很简单:curl默认会自动添加User-Agent请求头(格式类似User-Agent: curl/7.81.0),刚好避开了这个bug;但你用socat手动构造的请求里没有包含这个头,所以直接触发了panic。


解决方案

只需要在手动构造的HTTP请求中补充User-Agent头即可,同时推荐用printf代替echo -ne(不同Shell对echo的参数支持存在差异,printf的跨Shell兼容性更好)。

修复后的socat命令:

printf "GET /v1.50/containers/json HTTP/1.1\r\nHost: localhost\r\nUser-Agent: socat-client/1.0\r\nConnection: close\r\n\r\n" | socat - UNIX-CONNECT:/var/run/docker.sock

关键修改点说明:

  1. 添加User-Agent头:模拟curl的默认行为,直接规避Docker daemon的空数组访问bug;
  2. 使用printf构造请求:比echo -ne更可靠,确保\r\n等HTTP标准换行符被正确解析;
  3. 补充Connection: close头:告诉Docker daemon在返回响应后立即关闭连接,避免socat一直阻塞等待后续数据。

额外注意事项

  • 你提供的curl命令里的URL写的是http:/v1.50/containers/json(少了一个斜杠),虽然curl在--unix-socket模式下会忽略主机部分不影响,但建议统一写成标准格式http://localhost/v1.50/containers/json,避免后续混淆;
  • 如果你的Docker版本较新,这个bug已经被官方修复,但手动添加User-Agent头仍然是兼容不同版本的好习惯。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:57:58