diff --git a/app/discovery/provider/docker.go b/app/discovery/provider/docker.go index e10f6ec..c52533a 100644 --- a/app/discovery/provider/docker.go +++ b/app/discovery/provider/docker.go @@ -324,7 +324,19 @@ func (d *dockerClient) ListContainers() ([]containerInfo, error) { defer resp.Body.Close() - var response []struct { + if resp.StatusCode != http.StatusOK { + e := struct { + Message string `json:"message"` + }{} + + if err := json.NewDecoder(resp.Body).Decode(&e); err != nil { + return nil, fmt.Errorf("failed to parse error from docker daemon: %w", err) + } + + return nil, fmt.Errorf("unexpected error from docker daemon: %s", e.Message) + } + + response := []struct { ID string `json:"Id"` Name string State string diff --git a/app/discovery/provider/docker_test.go b/app/discovery/provider/docker_test.go index 23f07b5..e42f474 100644 --- a/app/discovery/provider/docker_test.go +++ b/app/discovery/provider/docker_test.go @@ -201,3 +201,16 @@ func TestDockerClient(t *testing.T) { assert.Empty(t, c[1].IP) } + +func TestDockerClient_error(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + http.Error(w, `{"message": "bruh"}`, http.StatusInternalServerError) + })) + + defer srv.Close() + addr := fmt.Sprintf("tcp://%s", strings.TrimPrefix(srv.URL, "http://")) + + client := NewDockerClient(addr, "bridge") + _, err := client.ListContainers() + require.EqualError(t, err, "unexpected error from docker daemon: bruh") +}