nginx-ui/internal/docker/status.go
2025-04-20 22:02:29 +08:00

58 lines
1.5 KiB
Go

package docker
import (
"context"
"github.com/docker/docker/client"
"github.com/uozi-tech/cosy"
)
type ContainerStatus int
const (
ContainerStatusCreated ContainerStatus = iota
ContainerStatusRunning
ContainerStatusPaused
ContainerStatusRestarting
ContainerStatusRemoving
ContainerStatusExited
ContainerStatusDead
ContainerStatusUnknown
ContainerStatusNotFound
)
var (
containerStatusMap = map[string]ContainerStatus{
"created": ContainerStatusCreated,
"running": ContainerStatusRunning,
"paused": ContainerStatusPaused,
"restarting": ContainerStatusRestarting,
"removing": ContainerStatusRemoving,
"exited": ContainerStatusExited,
"dead": ContainerStatusDead,
}
)
// GetContainerStatus checks the status of a given container.
func GetContainerStatus(ctx context.Context, containerID string) (ContainerStatus, error) {
cli, err := initClient()
if err != nil {
return ContainerStatusUnknown, cosy.WrapErrorWithParams(ErrClientNotInitialized, err.Error())
}
defer cli.Close()
containerJSON, err := cli.ContainerInspect(ctx, containerID)
if err != nil {
if client.IsErrNotFound(err) {
return ContainerStatusNotFound, nil // Container doesn't exist
}
return ContainerStatusUnknown, cosy.WrapErrorWithParams(ErrInspectContainer, err.Error())
}
// Can be one of "created", "running", "paused", "restarting", "removing", "exited", or "dead"
status, ok := containerStatusMap[containerJSON.State.Status]
if !ok {
return ContainerStatusUnknown, ErrContainerStatusUnknown
}
return status, nil
}