From c50524b3213f89a0e36861e7767631a171bd58b2 Mon Sep 17 00:00:00 2001 From: Shunsuke Suzuki Date: Mon, 29 Mar 2021 18:23:48 +0900 Subject: [PATCH] fix: search local images with Docker image ID (#151) * test: add a test to reproduce a problem * fix: search a local image with Docker image ID * refactor: inspect a Docker image in searchLocalImages --- .../provider/resource_docker_image_funcs.go | 23 +++++++++-------- .../provider/resource_docker_image_test.go | 25 +++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/internal/provider/resource_docker_image_funcs.go b/internal/provider/resource_docker_image_funcs.go index 5c070062..55758847 100644 --- a/internal/provider/resource_docker_image_funcs.go +++ b/internal/provider/resource_docker_image_funcs.go @@ -85,8 +85,10 @@ func resourceDockerImageRead(ctx context.Context, d *schema.ResourceData, meta i for id := range data.DockerImages { log.Printf("[DEBUG] local images data: %v", id) } - foundImage := searchLocalImages(data, d.Get("name").(string)) + imageName := d.Get("name").(string) + + foundImage := searchLocalImages(ctx, client, data, imageName) if foundImage == nil { d.SetId("") return nil @@ -122,13 +124,14 @@ func resourceDockerImageDelete(ctx context.Context, d *schema.ResourceData, meta return nil } -func searchLocalImages(data Data, imageName string) *types.ImageSummary { - if apiImage, ok := data.DockerImages[imageName]; ok { - log.Printf("[DEBUG] found local image via imageName: %v", imageName) - return apiImage +func searchLocalImages(ctx context.Context, client *client.Client, data Data, imageName string) *types.ImageSummary { + imageInspect, _, err := client.ImageInspectWithRaw(ctx, imageName) + if err != nil { + return nil } - if apiImage, ok := data.DockerImages[imageName+":latest"]; ok { - log.Printf("[DEBUG] found local image via imageName + latest: %v", imageName) + + if apiImage, ok := data.DockerImages[imageInspect.ID]; ok { + log.Printf("[DEBUG] found local image via imageName: %v", imageName) return apiImage } return nil @@ -150,7 +153,7 @@ func removeImage(ctx context.Context, d *schema.ResourceData, client *client.Cli return fmt.Errorf("Empty image name is not allowed") } - foundImage := searchLocalImages(data, imageName) + foundImage := searchLocalImages(ctx, client, data, imageName) if foundImage != nil { imageDeleteResponseItems, err := client.ImageRemove(ctx, imageName, types.ImageRemoveOptions{ @@ -283,7 +286,7 @@ func findImage(ctx context.Context, imageName string, client *client.Client, aut return nil, err } - foundImage := searchLocalImages(data, imageName) + foundImage := searchLocalImages(ctx, client, data, imageName) if foundImage != nil { return foundImage, nil } @@ -297,7 +300,7 @@ func findImage(ctx context.Context, imageName string, client *client.Client, aut return nil, err } - foundImage = searchLocalImages(data, imageName) + foundImage = searchLocalImages(ctx, client, data, imageName) if foundImage != nil { return foundImage, nil } diff --git a/internal/provider/resource_docker_image_test.go b/internal/provider/resource_docker_image_test.go index 044f8d54..08b3ec48 100644 --- a/internal/provider/resource_docker_image_test.go +++ b/internal/provider/resource_docker_image_test.go @@ -241,6 +241,25 @@ func testAccDockerImageDestroy(ctx context.Context, s *terraform.State) error { return nil } +func TestAccDockerImage_tag_sha265(t *testing.T) { + ctx := context.Background() + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProviderFactories: providerFactories, + CheckDestroy: func(state *terraform.State) error { + return testAccDockerImageDestroy(ctx, state) + }, + Steps: []resource.TestStep{ + { + Config: testDockerImageWithTagAndSHA256RepoDigest, + Check: resource.ComposeTestCheckFunc( + resource.TestMatchResourceAttr("docker_image.nginx", "latest", contentDigestRegexp), + ), + }, + }, + }) +} + func TestAccDockerImage_build(t *testing.T) { ctx := context.Background() wd, _ := os.Getwd() @@ -394,3 +413,9 @@ RUN echo ${test_arg} > test_arg.txt RUN apt-get update -qq ` + +const testDockerImageWithTagAndSHA256RepoDigest = ` +resource "docker_image" "nginx" { + name = "nginx:1.18.0-alpine@sha256:0c56c40f232f41c1b8341c3cc055c8b528cb6decefd7f7c8506e2d30bb9678b6" +} +`