函数里的 socket 连接没有被正确的关闭

我在我的代码里使用 Docker 的 client 时,发现在函数里面建立一个 Docker 的 client 后,当调用完毕后,函数里的 socket 并没有被关闭


下面是问题代码


import docker_types "github.com/docker/docker/api/types"
import docker "github.com/docker/docker/client"

func getDockerContainerInfo(containerId string) (ContainerInfo docker_types.ContainerJSON, err error) {
defaultHeaders := map[string]string{"User-Agent": "engine-api-cli-1.0"}
client, err := docker.NewClient(config.DockerSocket, "v1.24", nil, defaultHeaders)
if err != nil {
return
}
ContainerInfo, err = client.ContainerInspect(context.Background(), containerId)
if err != nil {
return
}
return
}

在使用过程中,发现系统文件描述符被用完了,通过 lsof 查看定位到了这个函数,发现原因是 docker client 连接 unix:///var/run/docker.sock 文件后,不关闭连接
然后改成下面这样的就没问题了


import docker_types "github.com/docker/docker/api/types"
import docker "github.com/docker/docker/client"
var dockerClient *docker.Client
func getDockerContainerInfo(containerId string) (ContainerInfo docker_types.ContainerJSON, err error) {
defaultHeaders := map[string]string{"User-Agent": "engine-api-cli-1.0"}
if dockerClient == nil {
dockerClient, err := docker.NewClient(config.DockerSocket, "v1.24", nil, defaultHeaders)
if err != nil {
return
}
}
ContainerInfo, err = dockerClient.ContainerInspect(context.Background(), containerId)
if err != nil {
return
}
return
}

也就是全局一个 docker client 对象

已邀请:

astaxie - 创造、获取、分享、传播和应用Go

赞同来自:

不应该啊,我刚查看了内部的实现,ensureReaderClosed有关闭

要回复问题请先登录注册