mirror of
https://gitee.com/dromara/mayfly-go
synced 2026-03-21 01:15:45 +08:00
feat: 资源操作统一管理&容器操作
This commit is contained in:
111
server/internal/docker/api/image.go
Normal file
111
server/internal/docker/api/image.go
Normal file
@@ -0,0 +1,111 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"mayfly-go/internal/docker/api/form"
|
||||
"mayfly-go/internal/docker/api/vo"
|
||||
"mayfly-go/internal/docker/dkm"
|
||||
"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/images", reqs[:]...)
|
||||
}
|
||||
|
||||
func (d *Image) GetImages(rc *req.Ctx) {
|
||||
cli, err := dkm.GetCli(rc.Query("host"))
|
||||
biz.ErrIsNil(err)
|
||||
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("host", imageOp.Host, "imageId", imageOp.ImageId)
|
||||
cli, err := dkm.GetCli(imageOp.Host)
|
||||
biz.ErrIsNil(err)
|
||||
err = cli.ImageRemove(imageOp.ImageId)
|
||||
biz.ErrIsNil(err)
|
||||
}
|
||||
|
||||
func (d *Image) ImageLoad(rc *req.Ctx) {
|
||||
host := rc.PostForm("host")
|
||||
biz.NotEmpty(host, "host cannot be empty")
|
||||
rc.ReqParam = host
|
||||
|
||||
fileheader, err := rc.FormFile("file")
|
||||
biz.ErrIsNilAppendErr(err, "read form file error: %s")
|
||||
|
||||
file, err := fileheader.Open()
|
||||
biz.ErrIsNil(err)
|
||||
defer file.Close()
|
||||
|
||||
cli, err := dkm.GetCli(host)
|
||||
biz.ErrIsNil(err)
|
||||
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) {
|
||||
host := rc.Query("host")
|
||||
biz.NotEmpty(host, "host cannot be empty")
|
||||
tag := rc.Query("tag")
|
||||
biz.NotEmpty(tag, "tag cannot be empty")
|
||||
|
||||
cli, err := dkm.GetCli(host)
|
||||
biz.ErrIsNil(err)
|
||||
|
||||
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))
|
||||
}
|
||||
Reference in New Issue
Block a user