fix: reconcile instance status with Docker on list, add IsContainerRunning
This commit is contained in:
@@ -33,6 +33,27 @@ func (s *Server) listInstances(w http.ResponseWriter, r *http.Request) {
|
|||||||
respondError(w, http.StatusInternalServerError, "internal server error")
|
respondError(w, http.StatusInternalServerError, "internal server error")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reconcile instance statuses with Docker's actual state.
|
||||||
|
ctx := r.Context()
|
||||||
|
for i, inst := range instances {
|
||||||
|
if inst.ContainerID == "" || inst.Status == "removing" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
running, err := s.docker.IsContainerRunning(ctx, inst.ContainerID)
|
||||||
|
if err != nil {
|
||||||
|
continue // Docker unreachable, keep stored status.
|
||||||
|
}
|
||||||
|
actualStatus := "stopped"
|
||||||
|
if running {
|
||||||
|
actualStatus = "running"
|
||||||
|
}
|
||||||
|
if inst.Status != actualStatus {
|
||||||
|
instances[i].Status = actualStatus
|
||||||
|
_ = s.store.UpdateInstanceStatus(inst.ID, actualStatus)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
respondJSON(w, http.StatusOK, instances)
|
respondJSON(w, http.StatusOK, instances)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -246,6 +246,15 @@ func (c *Client) ListContainers(ctx context.Context, labelFilters map[string]str
|
|||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsContainerRunning checks if a container is in the "running" state.
|
||||||
|
func (c *Client) IsContainerRunning(ctx context.Context, containerID string) (bool, error) {
|
||||||
|
inspectResult, err := c.api.ContainerInspect(ctx, containerID, client.ContainerInspectOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return inspectResult.Container.State != nil && inspectResult.Container.State.Running, nil
|
||||||
|
}
|
||||||
|
|
||||||
// InspectContainerPort returns the host port mapped to a given container port.
|
// InspectContainerPort returns the host port mapped to a given container port.
|
||||||
// This is useful after starting a container with auto-assigned ports.
|
// This is useful after starting a container with auto-assigned ports.
|
||||||
func (c *Client) InspectContainerPort(ctx context.Context, containerID string, containerPort string) (uint16, error) {
|
func (c *Client) InspectContainerPort(ctx context.Context, containerID string, containerPort string) (uint16, error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user