diff --git a/builtin/providers/docker/resource_docker_image.go b/builtin/providers/docker/resource_docker_image.go index 54822d738ebc..09b6d32b830e 100644 --- a/builtin/providers/docker/resource_docker_image.go +++ b/builtin/providers/docker/resource_docker_image.go @@ -26,6 +26,11 @@ func resourceDockerImage() *schema.Resource { Type: schema.TypeString, Computed: true, }, + + "keep_locally": &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + }, }, } } diff --git a/builtin/providers/docker/resource_docker_image_funcs.go b/builtin/providers/docker/resource_docker_image_funcs.go index cccb37dcf7b1..03d287c0bbd6 100644 --- a/builtin/providers/docker/resource_docker_image_funcs.go +++ b/builtin/providers/docker/resource_docker_image_funcs.go @@ -63,6 +63,11 @@ func searchLocalImages(data Data, imageName string) *dc.APIImages { func removeImage(d *schema.ResourceData, client *dc.Client) error { var data Data + + if keepLocally := d.Get("keep_locally").(bool); keepLocally { + return nil + } + if err := fetchLocalImages(&data, client); err != nil { return err } diff --git a/builtin/providers/docker/resource_docker_image_test.go b/builtin/providers/docker/resource_docker_image_test.go index 23e535f9eede..adf35fd9f19c 100644 --- a/builtin/providers/docker/resource_docker_image_test.go +++ b/builtin/providers/docker/resource_docker_image_test.go @@ -44,9 +44,36 @@ func TestAccDockerImage_private(t *testing.T) { }) } -func testAccDockerImageDestroy(s *terraform.State) error { - //client := testAccProvider.Meta().(*dc.Client) +func TestAccDockerImage_destroy(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: func(s *terraform.State) error { + for _, rs := range s.RootModule().Resources { + if rs.Type != "docker_image" { + continue + } + + client := testAccProvider.Meta().(*dc.Client) + _, err := client.InspectImage(rs.Primary.Attributes["latest"]) + if err != nil { + return err + } + } + return nil + }, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccDockerImageKeepLocallyConfig, + Check: resource.ComposeTestCheckFunc( + resource.TestMatchResourceAttr("docker_image.foobarzoo", "latest", contentDigestRegexp), + ), + }, + }, + }) +} +func testAccDockerImageDestroy(s *terraform.State) error { for _, rs := range s.RootModule().Resources { if rs.Type != "docker_image" { continue @@ -76,3 +103,10 @@ resource "docker_image" "foobar" { keep_updated = true } ` + +const testAccDockerImageKeepLocallyConfig = ` +resource "docker_image" "foobarzoo" { + name = "crux:3.1" + keep_locally = true +} +` diff --git a/website/source/docs/providers/docker/r/image.html.markdown b/website/source/docs/providers/docker/r/image.html.markdown index 584f373af9a9..d6c0dcf56508 100644 --- a/website/source/docs/providers/docker/r/image.html.markdown +++ b/website/source/docs/providers/docker/r/image.html.markdown @@ -33,6 +33,9 @@ The following arguments are supported: always be updated on the host to the latest. If this is false, as long as an image is downloaded with the correct tag, it won't be redownloaded if there is a newer image. +* `keep_locally` - (Optional, boolean) If true, then the Docker image won't be + deleted on destroy operation. If this is false, it will delete the image from + the docker local storage on destroy operation. ## Attributes Reference