feat: add force_remove option to r/image (#104)

This commit is contained in:
Shunsuke Suzuki 2020-12-29 16:03:40 +09:00 committed by GitHub
parent 3ef7a702d5
commit 4b80bc3d9d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 38 additions and 3 deletions

View file

@ -51,6 +51,12 @@ func resourceDockerImage() *schema.Resource {
}, },
}, },
"force_remove": {
Type: schema.TypeBool,
Description: "Force remove the image when the resource is destroyed",
Optional: true,
},
"build": { "build": {
Type: schema.TypeSet, Type: schema.TypeSet,
Optional: true, Optional: true,

View file

@ -152,7 +152,9 @@ func removeImage(d *schema.ResourceData, client *client.Client) error {
foundImage := searchLocalImages(data, imageName) foundImage := searchLocalImages(data, imageName)
if foundImage != nil { if foundImage != nil {
imageDeleteResponseItems, err := client.ImageRemove(context.Background(), foundImage.ID, types.ImageRemoveOptions{}) imageDeleteResponseItems, err := client.ImageRemove(context.Background(), imageName, types.ImageRemoveOptions{
Force: d.Get("force_remove").(bool),
})
if err != nil { if err != nil {
return err return err
} }

View file

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"os" "os"
"os/exec"
"path" "path"
"regexp" "regexp"
"testing" "testing"
@ -15,7 +16,19 @@ import (
var contentDigestRegexp = regexp.MustCompile(`\A[A-Za-z0-9_\+\.-]+:[A-Fa-f0-9]+\z`) var contentDigestRegexp = regexp.MustCompile(`\A[A-Za-z0-9_\+\.-]+:[A-Fa-f0-9]+\z`)
const testForceRemoveDockerImageName = "alpine:3.11.5"
func TestAccDockerImage_basic(t *testing.T) { func TestAccDockerImage_basic(t *testing.T) {
// run a Docker container which refers the Docker image to test "force_remove" option
containerName := "test-docker-image-force-remove"
if err := exec.Command("docker", "run", "--rm", "-d", "--name", containerName, testForceRemoveDockerImageName, "tail", "-f", "/dev/null").Run(); err != nil {
t.Fatal(err)
}
defer func() {
if err := exec.Command("docker", "stop", containerName).Run(); err != nil {
t.Logf("failed to stop the Docker container %s: %v", containerName, err)
}
}()
resource.Test(t, resource.TestCase{ resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) }, PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders, Providers: testAccProviders,
@ -27,6 +40,12 @@ func TestAccDockerImage_basic(t *testing.T) {
resource.TestMatchResourceAttr("docker_image.foo", "latest", contentDigestRegexp), resource.TestMatchResourceAttr("docker_image.foo", "latest", contentDigestRegexp),
), ),
}, },
{
Config: testAccForceRemoveDockerImage,
Check: resource.ComposeTestCheckFunc(
resource.TestMatchResourceAttr("docker_image.test", "latest", contentDigestRegexp),
),
},
}, },
}) })
} }
@ -58,7 +77,7 @@ func TestAccDockerImage_destroy(t *testing.T) {
} }
client := testAccProvider.Meta().(*ProviderConfig).DockerClient client := testAccProvider.Meta().(*ProviderConfig).DockerClient
_, _, err := client.ImageInspectWithRaw(context.Background(), rs.Primary.Attributes["latest"]) _, _, err := client.ImageInspectWithRaw(context.Background(), rs.Primary.Attributes["name"])
if err != nil { if err != nil {
return err return err
} }
@ -195,7 +214,7 @@ func testAccDockerImageDestroy(s *terraform.State) error {
} }
client := testAccProvider.Meta().(*ProviderConfig).DockerClient client := testAccProvider.Meta().(*ProviderConfig).DockerClient
_, _, err := client.ImageInspectWithRaw(context.Background(), rs.Primary.Attributes["latest"]) _, _, err := client.ImageInspectWithRaw(context.Background(), rs.Primary.Attributes["name"])
if err == nil { if err == nil {
return fmt.Errorf("Image still exists") return fmt.Errorf("Image still exists")
} }
@ -231,6 +250,13 @@ resource "docker_image" "foo" {
} }
` `
const testAccForceRemoveDockerImage = `
resource "docker_image" "test" {
name = "` + testForceRemoveDockerImageName + `"
force_remove = true
}
`
const testAddDockerPrivateImageConfig = ` const testAddDockerPrivateImageConfig = `
resource "docker_image" "foobar" { resource "docker_image" "foobar" {
name = "gcr.io:443/google_containers/pause:0.8.0" name = "gcr.io:443/google_containers/pause:0.8.0"

View file

@ -52,6 +52,7 @@ The following arguments are supported:
registry when using the `docker_registry_image` [data source](/docs/providers/docker/d/registry_image.html) registry when using the `docker_registry_image` [data source](/docs/providers/docker/d/registry_image.html)
to trigger an image update. to trigger an image update.
* `pull_trigger` - **Deprecated**, use `pull_triggers` instead. * `pull_trigger` - **Deprecated**, use `pull_triggers` instead.
* `force_remove` - (Optional, boolean) If true, then the image is removed Forcely when the resource is destroyed.
* `build` - (Optional, block) See [Build](#build-1) below for details. * `build` - (Optional, block) See [Build](#build-1) below for details.
<a id="build-1"></a> <a id="build-1"></a>