mirror of
https://github.com/kreuzwerker/terraform-provider-docker.git
synced 2025-12-20 22:59:42 -05:00
feat: add force_remove option to r/image (#104)
This commit is contained in:
parent
3ef7a702d5
commit
4b80bc3d9d
4 changed files with 38 additions and 3 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue