func (srv ImageService) ExportImage(c gin.Context) { name := c.Query("name") id := c.Query("id") raw, _, err := srv.cli.ImageInspectWithRaw(context.Background(), id) if err != nil { logger.Error(err.Error()) } save, err := srv.cli.ImageSave(context.Background(), []string{raw.ID}) if err != nil { logger.Error(err.Error()) msg := response.WsMsg{ Code: 2015, Msg: err.Error(), Name: raw.RepoTags[0], } wsResp := response.WsResp{ Type: "docker", Data: msg, } marshal, err := json.Marshal(wsResp) if err != nil { logger.Error(err.Error()) return } _, err = srv.dbus.GetWithTimeout(5time.Second, ipc.ClientParam{ Dest: "com.ugreen.entry.wss", Path: "/com/ugreen/entry/wss", Method: "SendWssDbus", }, string(marshal)) if err != nil { logger.Error(err.Error()) return } } defer func() { err = save.Close() if err != nil { logger.Error(err.Error()) } }() name = fmt.Sprintf("%s.sync.tar", name) reader, writer := io.Pipe() go func() { defer func() { err = reader.Close() if err != nil { logger.Error(err.Error()) } err = writer.Close() if err != nil { logger.Error(err.Error()) } }() encoder := json.NewEncoder(writer) err = encoder.Encode(save) if err != nil { logger.Error(err.Error()) msg := response.WsMsg{ Code: 2015, Msg: err.Error(), Name: raw.RepoTags[0], } wsResp := response.WsResp{ Type: "docker", Data: msg, } marshal, err := json.Marshal(wsResp) if err != nil { logger.Error(err.Error()) return } _, err = srv.dbus.GetWithTimeout(5time.Second, ipc.ClientParam{ Dest: "com.ugreen.entry.wss", Path: "/com/ugreen/entry/wss", Method: "SendWssDbus", }, string(marshal)) if err != nil { logger.Error(err.Error()) return } } }() c.Header("Content-Disposition", "attachment; filename=" + name) c.Header("Content-Type", "application/octet-stream") _, err = io.Copy(c.Writer, reader) if err != nil { logger.Error(err.Error()) c.String(http.StatusInternalServerError, "Failed to write response stream") msg := response.WsMsg{ Code: 2015, Msg: err.Error(), Name: raw.RepoTags[0], } wsResp := response.WsResp{ Type: "docker", Data: msg, } marshal, err := json.Marshal(wsResp) if err != nil { logger.Error(err.Error()) return } _, err = srv.dbus.GetWithTimeout(5time.Second, ipc.ClientParam{ Dest: "com.ugreen.entry.wss", Path: "/com/ugreen/entry/wss", Method: "SendWssDbus", }, string(marshal)) if err != nil { logger.Error(err.Error()) return } return } msg := response.WsMsg{ Code: 2014, Name: raw.RepoTags[0], } wsResp := response.WsResp{ Type: "docker", Data: msg, } marshal, err := json.Marshal(wsResp) if err != nil { logger.Error(err.Error()) return } _, err = srv.dbus.GetWithTimeout(5time.Second, ipc.ClientParam{ Dest: "com.ugreen.entry.wss", Path: "/com/ugreen/entry/wss", Method: "SendWssDbus", }, string(marshal)) if err != nil { logger.Error(err.Error()) return } c.Status(http.StatusOK) }

Go Gin 框架导出 Docker Image 为 .sync.tar 文件流

原文地址: https://www.cveoy.top/t/topic/fUlD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录