mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-02 23:40:24 +08:00
101 lines
2.4 KiB
Go
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))
|
|
}
|