diff --git a/internal/provider/data_source_docker_image.go b/internal/provider/data_source_docker_image.go index 66f04c1a..d54d9e42 100644 --- a/internal/provider/data_source_docker_image.go +++ b/internal/provider/data_source_docker_image.go @@ -44,7 +44,10 @@ func dataSourceDockerImageRead(ctx context.Context, d *schema.ResourceData, meta imageName := d.Get("name").(string) - foundImage := searchLocalImages(ctx, client, data, imageName) + foundImage, err := searchLocalImages(ctx, client, data, imageName) + if err != nil { + return diag.Errorf("dataSourceDockerImageRead: error looking up local image %q: %s", imageName, err) + } if foundImage == nil { return diag.Errorf("did not find docker image '%s'", imageName) } diff --git a/internal/provider/data_source_docker_image_test.go b/internal/provider/data_source_docker_image_test.go index 4fcfbbb7..5856685d 100644 --- a/internal/provider/data_source_docker_image_test.go +++ b/internal/provider/data_source_docker_image_test.go @@ -140,7 +140,7 @@ func TestAccDockerImageDataSource_withNonExistentImage(t *testing.T) { { Config: ` data "docker_image" "foo" { - name = "nginx@shaDoesNotExist" + name = "nginx@sha256:3614ca5eacf0a3a1bcc361c939202a974b4902b9334ff36eb29ffe9011aaad83" } `, ExpectError: regexp.MustCompile(`.*did not find docker image.*`), @@ -148,7 +148,7 @@ func TestAccDockerImageDataSource_withNonExistentImage(t *testing.T) { { Config: ` data "docker_image" "foo" { - name = "nginx:1.19.1@shaDoesNotExist" + name = "nginx:1.19.1@sha256:3614ca5eacf0a3a1bcc361c939202a974b4902b9334ff36eb29ffe9011aaad83" } `, ExpectError: regexp.MustCompile(`.*did not find docker image.*`), diff --git a/internal/provider/resource_docker_image_funcs.go b/internal/provider/resource_docker_image_funcs.go index e369efaf..467b0173 100644 --- a/internal/provider/resource_docker_image_funcs.go +++ b/internal/provider/resource_docker_image_funcs.go @@ -17,6 +17,7 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/versions" "github.com/docker/docker/client" + "github.com/docker/docker/errdefs" "github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/jsonmessage" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" @@ -63,7 +64,10 @@ func resourceDockerImageRead(ctx context.Context, d *schema.ResourceData, meta i imageName := d.Get("name").(string) - foundImage := searchLocalImages(ctx, client, data, imageName) + foundImage, err := searchLocalImages(ctx, client, data, imageName) + if err != nil { + return diag.Errorf("resourceDockerImageRead: error looking up local image %q: %s", imageName, err) + } if foundImage == nil { log.Printf("[DEBUG] did not find image with name: %v", imageName) d.SetId("") @@ -106,20 +110,26 @@ func resourceDockerImageDelete(ctx context.Context, d *schema.ResourceData, meta } // Helpers -func searchLocalImages(ctx context.Context, client *client.Client, data Data, imageName string) *types.ImageSummary { +func searchLocalImages(ctx context.Context, client *client.Client, data Data, imageName string) (*types.ImageSummary, error) { imageInspect, _, err := client.ImageInspectWithRaw(ctx, imageName) if err != nil { - return nil + if errdefs.IsNotFound(err) { + return nil, nil + } + return nil, fmt.Errorf("unable to inspect image %s: %w", imageName, err) } - jsonObj, _ := json.MarshalIndent(imageInspect, "", "\t") + jsonObj, err := json.MarshalIndent(imageInspect, "", "\t") + if err != nil { + return nil, fmt.Errorf("error parsing inspect response: %w", err) + } log.Printf("[DEBUG] Docker image inspect from readFunc: %s", jsonObj) if apiImage, ok := data.DockerImages[imageInspect.ID]; ok { log.Printf("[DEBUG] found local image via imageName: %v", imageName) - return apiImage + return apiImage, nil } - return nil + return nil, nil } func removeImage(ctx context.Context, d *schema.ResourceData, client *client.Client) error { @@ -138,7 +148,10 @@ func removeImage(ctx context.Context, d *schema.ResourceData, client *client.Cli return fmt.Errorf("empty image name is not allowed") } - foundImage := searchLocalImages(ctx, client, data, imageName) + foundImage, err := searchLocalImages(ctx, client, data, imageName) + if err != nil { + return fmt.Errorf("removeImage: error looking up local image %q: %w", imageName, err) + } if foundImage != nil { imageDeleteResponseItems, err := client.ImageRemove(ctx, imageName, types.ImageRemoveOptions{ @@ -157,7 +170,7 @@ func removeImage(ctx context.Context, d *schema.ResourceData, client *client.Cli func fetchLocalImages(ctx context.Context, data *Data, client *client.Client) error { images, err := client.ImageList(ctx, types.ImageListOptions{All: false}) if err != nil { - return fmt.Errorf("unable to list Docker images: %s", err) + return fmt.Errorf("unable to list Docker images: %w", err) } if data.DockerImages == nil { @@ -199,14 +212,14 @@ func pullImage(ctx context.Context, data *Data, client *client.Client, authConfi encodedJSON, err := json.Marshal(auth) if err != nil { - return fmt.Errorf("error creating auth config: %s", err) + return fmt.Errorf("error creating auth config: %w", err) } out, err := client.ImagePull(ctx, image, types.ImagePullOptions{ RegistryAuth: base64.URLEncoding.EncodeToString(encodedJSON), }) if err != nil { - return fmt.Errorf("error pulling image %s: %s", image, err) + return fmt.Errorf("error pulling image %s: %w", image, err) } defer out.Close() @@ -272,7 +285,10 @@ func findImage(ctx context.Context, imageName string, client *client.Client, aut return nil, err } - foundImage := searchLocalImages(ctx, client, data, imageName) + foundImage, err := searchLocalImages(ctx, client, data, imageName) + if err != nil { + return nil, fmt.Errorf("findImage1: error looking up local image %q: %w", imageName, err) + } if foundImage != nil { return foundImage, nil } @@ -286,7 +302,10 @@ func findImage(ctx context.Context, imageName string, client *client.Client, aut return nil, err } - foundImage = searchLocalImages(ctx, client, data, imageName) + foundImage, err = searchLocalImages(ctx, client, data, imageName) + if err != nil { + return nil, fmt.Errorf("findImage2: error looking up local image %q: %w", imageName, err) + } if foundImage != nil { return foundImage, nil }