Docker API执行Exec命令返回乱码字节问题排查求助
问题排查:Docker API Exec响应开头乱码
问题背景
通过Postman调用Docker API 1.41执行容器内命令,获取/sbin目录下文件的哈希值与大小,命令可正常执行,但响应开头出现乱码字节。
创建Exec实例请求
POST http://localhost:2375/v1.41/containers/{containerid}/exec
请求体:
{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "DetachKeys": "ctrl-p,ctrl-q", "Tty": false, "Cmd": [ "sh", "-c", "find /sbin/* -type f -print0 | xargs -0 sh -c 'paste -d \" \" <(md5sum \"$@\") <(sha1sum \"$@\") <(sha256sum \"$@\") <(du -lh \"$@\")' bash | tr -s ' ' | cut -d ' ' -f 1,3,5,6" ] }
创建结果
{ "Id": "5243df9ea1d665d5eef78593c8d1031e4a3c61feb20267a974119a7f70d87d24" }
启动Exec命令请求
POST http://localhost:2375/v1.41/exec/5243df9ea1d665d5eef78593c8d1031e4a3c61feb20267a974119a7f70d87d24/start
请求体:
{ "Detach": false, "Tty": false }
执行结果(含乱码)
锟絚bf83b97caceaeb98d449946cda46dba 3f5a14046fd530c8679dd7f67c15ec6570631d51 7995d69305583789568e85eeac0abf0c3c7166c4edb53afc5910e57ff0b37650 /sbin/apk 5830d01f7821b978df770b06db3790921 2a36b6f8f3992b112450e66ac128c2ea499a103e b4a2c06db38742e8c42c3c9838b285a7d8cdac6c091ff3df5ff9a15f1e41b9c7 /sbin/ldconfig 90292714bf3b5d86c997f10f64f92a50 f9ff078ddf9d9074b4dcee9965a230ee66fc9cb3 ab0f9ffe6fb1064ed2736c8191f841daaf54700f5e7b670e56fca7d7855dece8 /sbin/mkmntdirs
原因分析
Docker Exec API的响应采用多路复用二进制流格式,并非纯文本。开头的乱码是Docker添加的8字节帧头:
- 前4字节:标识流类型(1=stdout,2=stderr)
- 后4字节:大端字节序的后续内容长度
Postman直接将二进制帧头当作UTF-8文本解析,导致出现乱码。
解决方法
方法1:使用Docker官方SDK处理
使用Docker官方提供的SDK(如Python/Go SDK)发送请求,SDK会自动解析二进制帧头,分离stdout和stderr内容,无需手动处理。
方法2:手动解析帧头
如果必须用Postman或自定义工具处理,需要手动解析二进制响应:
- 读取响应的前8字节二进制数据
- 解析出流类型和内容长度
- 跳过这8字节,读取后续对应长度的文本内容,即为实际命令输出
内容的提问来源于stack exchange,提问作者Elias
相关产品推荐
相关产品推荐

