Files
mayfly-go/server/internal/docker/api/image.go
2025-09-06 21:32:48 +08:00

101 lines
2.4 KiB
Go

package api
import (
"fmt"
"io"
"mayfly-go/internal/docker/api/form"
"mayfly-go/internal/docker/api/vo"
"mayfly-go/internal/docker/imsg"
"mayfly-go/pkg/biz"
"mayfly-go/pkg/req"
"mayfly-go/pkg/utils/collx"
"mayfly-go/pkg/utils/jsonx"
"time"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/image"
"github.com/docker/docker/client"
)
type Image struct {
}
func (d *Image) ReqConfs() *req.Confs {
reqs := [...]*req.Conf{
req.NewGet("", d.GetImages),
req.NewPost("/remove", d.ImageRemove).Log(req.NewLogSaveI(imsg.LogDockerImageRemove)),
req.NewGet("/save", d.ImageExport).NoRes(),
req.NewPost("/load", d.ImageLoad).Log(req.NewLogSaveI(imsg.LogDockerImageLoad)),
}
return req.NewConfs("docker/:id/images", reqs[:]...)
}
func (d *Image) GetImages(rc *req.Ctx) {
cli := GetCli(rc)
is, err := cli.ImageList()
biz.ErrIsNil(err)
containers, _ := cli.ContainerList()
imageId2Container := collx.ArrayToMap(containers, func(item container.Summary) string {
return item.ImageID
})
rc.ResData = collx.ArrayMap[image.Summary, vo.Image](is, func(val image.Summary) vo.Image {
c := vo.Image{
Id: val.ID,
Size: val.Size,
CreateTime: time.Unix(val.Created, 0),
Tags: val.RepoTags,
IsUse: imageId2Container[val.ID].ID != "",
}
return c
})
}
func (d *Image) ImageRemove(rc *req.Ctx) {
imageOp := &form.ImageOp{}
biz.ErrIsNil(rc.BindJSON(imageOp))
rc.ReqParam = collx.Kvs("imageId", imageOp.ImageId)
cli := GetCli(rc)
biz.ErrIsNil(cli.ImageRemove(imageOp.ImageId))
}
func (d *Image) ImageLoad(rc *req.Ctx) {
fileheader, err := rc.FormFile("file")
biz.ErrIsNilAppendErr(err, "read form file error: %s")
file, err := fileheader.Open()
biz.ErrIsNil(err)
defer file.Close()
cli := GetCli(rc)
rc.ReqParam = cli.Server
resp, err := cli.DockerClient.ImageLoad(rc.MetaCtx, file)
biz.ErrIsNil(err)
defer resp.Body.Close()
content, err := io.ReadAll(resp.Body)
biz.ErrIsNil(err)
errMsg, _ := jsonx.GetStringByBytes(content, "errorDetail.message")
biz.IsTrue(errMsg == "", "%s", errMsg)
}
func (d *Image) ImageExport(rc *req.Ctx) {
tag := rc.Query("tag")
biz.NotEmpty(tag, "tag cannot be empty")
cli := GetCli(rc)
reader, err := cli.DockerClient.ImageSave(rc.MetaCtx, []string{tag}, client.ImageSaveWithPlatforms())
biz.ErrIsNil(err)
defer reader.Close()
filename := rc.QueryDefault("filename", tag)
rc.Download(reader, fmt.Sprintf("%s.tar", filename))
}