Chef Docker-API Cookbook执行失败,报malformed header错误
Chef Docker Cookbook API命令执行失败(报"malformed header")问题排查与解决
核心问题现状
- Chef客户端执行
docker_registry、docker_image、docker_container等Docker Cookbook API命令时失败,报错Excon::Error::Socket: malformed header (Excon::Error::ResponseParse) - 配方中的Docker CLI命令可正常连接Docker Hub及私有Nexus镜像仓库拉取镜像
- 未对Chef服务器、客户端、Cookbook及版本做任何变更,升级Chef-client(v15.1.36)和Docker Cookbook(v8.0.1)至新版本后问题依旧
- 开发、生产环境共约40个节点几乎同时出现同步失败
可能根因及排查解决步骤
1. 检查Docker守护进程API响应头异常
Docker Cookbook依赖Docker API交互,与CLI的通信逻辑存在差异:
- 查看Docker守护进程日志:
journalctl -u docker,排查是否有格式异常的HTTP响应头输出 - 手动调用Docker API测试:
curl -v --unix-socket /var/run/docker.sock http://localhost/v1.24/images/json,观察响应头是否存在特殊字符、换行异常或字段长度超限等问题
2. 排查网络层代理/防火墙的头部篡改
节点与镜像仓库间的代理或防火墙可能修改HTTP响应头:
- 对比Docker CLI与Cookbook的代理配置:CLI可能读取系统代理,而Cookbook依赖的Excon库可能使用不同大小写的环境变量(如
HTTP_PROXYvshttp_proxy) - 临时关闭节点代理服务,重新执行Chef-client测试
- 检查防火墙/WAF规则,确认是否对Docker API的请求/响应头做了修改
3. 修复Excon库版本兼容性问题
Docker Cookbook依赖Excon库处理HTTP请求,可能存在版本冲突:
- 查看当前Excon版本:
chef gem list excon - 切换至与Chef 15.x兼容的稳定版本:
chef gem install excon -v 0.70.0,重新执行Chef-client测试
4. 排查Docker守护进程状态与版本兼容性
- 检查Docker守护进程版本:
docker version,确认Docker Cookbook v8.0.1支持当前版本(该版本兼容Docker API 1.24+,守护进程版本需不低于17.03) - 重启Docker守护进程修复进程异常:
systemctl restart docker
临时应急方案
若需快速恢复节点,可将Cookbook中的Docker API资源替换为CLI命令:
# 替换docker_image资源为execute资源 execute 'pull samba image' do command 'docker pull dperson/samba' not_if 'docker images | grep dperson/samba' end
内容的提问来源于stack exchange,提问作者zane.sa
相关产品推荐
相关产品推荐

