(req dto.BatchDelete)
| 497 | } |
| 498 | |
| 499 | func (u *ImageService) ImageRemove(req dto.BatchDelete) error { |
| 500 | client, err := docker.NewDockerClient() |
| 501 | if err != nil { |
| 502 | return err |
| 503 | } |
| 504 | defer client.Close() |
| 505 | taskItem, err := task.NewTaskWithOps(strings.Join(req.Names, ","), task.TaskDelete, task.TaskScopeImage, req.TaskID, 1) |
| 506 | if err != nil { |
| 507 | global.LOG.Errorf("new task for create container failed, err: %v", err) |
| 508 | return err |
| 509 | } |
| 510 | |
| 511 | for _, id := range req.Names { |
| 512 | taskItem.AddSubTask(i18n.GetMsgByKey("TaskDelete")+id, func(t *task.Task) error { |
| 513 | imageItem, err := client.ImageInspect(context.TODO(), id) |
| 514 | if err != nil { |
| 515 | return err |
| 516 | } |
| 517 | if _, err := client.ImageRemove(context.TODO(), id, image.RemoveOptions{Force: req.Force, PruneChildren: true}); err != nil { |
| 518 | if strings.Contains(err.Error(), "image is being used") || strings.Contains(err.Error(), "is using") { |
| 519 | if strings.Contains(id, "sha256:") { |
| 520 | return buserr.New("ErrObjectInUsed") |
| 521 | } |
| 522 | return buserr.WithDetail("ErrInUsed", id, nil) |
| 523 | } |
| 524 | if strings.Contains(err.Error(), "image has dependent") { |
| 525 | return buserr.New("ErrObjectBeDependent") |
| 526 | } |
| 527 | return err |
| 528 | } |
| 529 | taskItem.Log(i18n.GetMsgWithMap("ImageRemoveHelper", map[string]interface{}{"name": id, "size": common.LoadSizeUnit2F(float64(imageItem.Size))})) |
| 530 | return nil |
| 531 | }, nil) |
| 532 | } |
| 533 | if len(req.TaskID) == 0 { |
| 534 | return taskItem.Execute() |
| 535 | } |
| 536 | go func() { |
| 537 | _ = taskItem.Execute() |
| 538 | }() |
| 539 | return nil |
| 540 | } |
| 541 | |
| 542 | func checkUsed(imageID string, containers []container.Summary) bool { |
| 543 | for _, container := range containers { |
nothing calls this directly
no test coverage detected