status.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package docker
  2. import (
  3. "context"
  4. "github.com/docker/docker/client"
  5. "github.com/uozi-tech/cosy"
  6. )
  7. type ContainerStatus int
  8. const (
  9. ContainerStatusCreated ContainerStatus = iota
  10. ContainerStatusRunning
  11. ContainerStatusPaused
  12. ContainerStatusRestarting
  13. ContainerStatusRemoving
  14. ContainerStatusExited
  15. ContainerStatusDead
  16. ContainerStatusUnknown
  17. ContainerStatusNotFound
  18. )
  19. var (
  20. containerStatusMap = map[string]ContainerStatus{
  21. "created": ContainerStatusCreated,
  22. "running": ContainerStatusRunning,
  23. "paused": ContainerStatusPaused,
  24. "restarting": ContainerStatusRestarting,
  25. "removing": ContainerStatusRemoving,
  26. "exited": ContainerStatusExited,
  27. "dead": ContainerStatusDead,
  28. }
  29. )
  30. // GetContainerStatus checks the status of a given container.
  31. func GetContainerStatus(ctx context.Context, containerID string) (ContainerStatus, error) {
  32. cli, err := initClient()
  33. if err != nil {
  34. return ContainerStatusUnknown, cosy.WrapErrorWithParams(ErrClientNotInitialized, err.Error())
  35. }
  36. defer cli.Close()
  37. containerJSON, err := cli.ContainerInspect(ctx, containerID)
  38. if err != nil {
  39. if client.IsErrNotFound(err) {
  40. return ContainerStatusNotFound, nil // Container doesn't exist
  41. }
  42. return ContainerStatusUnknown, cosy.WrapErrorWithParams(ErrInspectContainer, err.Error())
  43. }
  44. // Can be one of "created", "running", "paused", "restarting", "removing", "exited", or "dead"
  45. status, ok := containerStatusMap[containerJSON.State.Status]
  46. if !ok {
  47. return ContainerStatusUnknown, ErrContainerStatusUnknown
  48. }
  49. return status, nil
  50. }