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
This commit is contained in:
Shunsuke Suzuki 2021-03-29 18:23:48 +09:00 committed by GitHub
parent 4936f08c4b
commit c50524b321
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 10 deletions

View file

@ -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
}

View file

@ -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"
}
`