使用go读取docker容器输出时乱码的解决方案

,

在使用go操作docker读取容器的输出时, 每一行的开头会有乱码, 最开始怀疑是容器的字符集问题, 但是把容器的字符集调整为utf8也会有这个问题

每一行的开头都有乱码

解决的办法

func printContainerLogs(containerID string) (string, error) {
	out, err := global.DockerCli.ContainerLogs(global.Ctx, containerID, types.ContainerLogsOptions{ShowStdout: true, ShowStderr: true})
	if err != nil {
		return "", fmt.Errorf("读取容器日志失败:%v", err)
	}
	defer func(out io.ReadCloser) {
		err := out.Close()
		if err != nil {
			global.Logger.Errorf("关闭容器%s的out失败", containerID)
		}
	}(out)

        //重点在这里, 需要用stdcopy方法把ContainerLogs方法返回reader复制到我们新的buffer上, 然后读取buf的输出
	var buf bytes.Buffer
	if _, err = stdcopy.StdCopy(&buf, &buf, out); err != nil {
		global.Logger.Errorf("读取容器的输出为utf8失败:%v", err)
		return "", err
	}
	logs := buf.String()
	return logs, nil
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注