in cleanup.go [129:193]
func (c *CustomDockerClient) diskSpaceRemotely(path string) (ds DiskSpace, err error) {
_, err = c.InspectImage(diskSpaceImage)
if err != nil {
logrus.Debugln("Pulling", diskSpaceImage, "...")
err = c.PullImage(docker.PullImageOptions{
Repository: diskSpaceImage,
}, docker.AuthConfiguration{})
if err != nil {
return
}
}
// create container for the first time
container, err := c.CreateContainer(docker.CreateContainerOptions{
Config: &docker.Config{
Image: diskSpaceImage,
Entrypoint: []string{"/bin/stat"},
Cmd: []string{"-f", "-c%a %b %s %d %c", path},
AttachStdout: true,
},
})
if err != nil {
return
}
defer c.RemoveContainer(docker.RemoveContainerOptions{
ID: container.ID,
Force: true,
})
err = c.StartContainer(container.ID, nil)
if err != nil {
return
}
errorCode, err := c.WaitContainer(container.ID)
if err != nil || errorCode != 0 {
return
}
var buffer bytes.Buffer
err = c.Logs(docker.LogsOptions{
Container: container.ID,
OutputStream: &buffer,
Stdout: true,
Tail: "1",
})
if err != nil {
return
}
var freeBlocks, totalBlocks, blockSize, freeFiles, totalFiles uint64
_, err = fmt.Fscanln(&buffer, &freeBlocks, &totalBlocks, &blockSize, &freeFiles, &totalFiles)
if err != nil {
return
}
ds = DiskSpace{
BytesFree: uint64(freeBlocks * blockSize),
BytesTotal: uint64(totalBlocks * blockSize),
FilesFree: freeFiles,
FilesTotal: totalFiles,
}
return
}