mirror of
https://github.com/kreuzwerker/terraform-provider-docker.git
synced 2025-12-22 15:49:34 -05:00
fix: pass container rm flag (#322)
* fix: pass container rm flag * fix: deletion of containers * docs: website gen * docs: add stargazers * fix(docs): for #321
This commit is contained in:
parent
0da4706851
commit
3fbe7d3a34
8 changed files with 35 additions and 19 deletions
|
|
@ -109,3 +109,8 @@ To contribute, please read the contribution guidelines: [Contributing to Terrafo
|
||||||
## License
|
## License
|
||||||
|
|
||||||
The Terraform Provider Docker is available to everyone under the terms of the Mozilla Public License Version 2.0. [Take a look the LICENSE file](LICENSE).
|
The Terraform Provider Docker is available to everyone under the terms of the Mozilla Public License Version 2.0. [Take a look the LICENSE file](LICENSE).
|
||||||
|
|
||||||
|
|
||||||
|
## Stargazers over time
|
||||||
|
|
||||||
|
[](https://starchart.cc/kreuzwerker/terraform-provider-docker)
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ resource "docker_image" "ubuntu" {
|
||||||
- **read_only** (Boolean) If `true`, the container will be started as readonly. Defaults to `false`.
|
- **read_only** (Boolean) If `true`, the container will be started as readonly. Defaults to `false`.
|
||||||
- **remove_volumes** (Boolean) If `true`, it will remove anonymous volumes associated with the container. Defaults to `true`.
|
- **remove_volumes** (Boolean) If `true`, it will remove anonymous volumes associated with the container. Defaults to `true`.
|
||||||
- **restart** (String) The restart policy for the container. Must be one of 'no', 'on-failure', 'always', 'unless-stopped'. Defaults to `no`.
|
- **restart** (String) The restart policy for the container. Must be one of 'no', 'on-failure', 'always', 'unless-stopped'. Defaults to `no`.
|
||||||
- **rm** (Boolean) If `true`, then the container will be automatically removed after his execution. Terraform won't check this container after creation. Defaults to `false`.
|
- **rm** (Boolean) If `true`, then the container will be automatically removed when it exits. Defaults to `false`.
|
||||||
- **security_opts** (Set of String) List of string values to customize labels for MLS systems, such as SELinux. See https://docs.docker.com/engine/reference/run/#security-configuration.
|
- **security_opts** (Set of String) List of string values to customize labels for MLS systems, such as SELinux. See https://docs.docker.com/engine/reference/run/#security-configuration.
|
||||||
- **shm_size** (Number) Size of `/dev/shm` in MBs.
|
- **shm_size** (Number) Size of `/dev/shm` in MBs.
|
||||||
- **start** (Boolean) If `true`, then the Docker container will be started after creation. If `false`, then the container is only created. Defaults to `true`.
|
- **start** (Boolean) If `true`, then the Docker container will be started after creation. If `false`, then the container is only created. Defaults to `true`.
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,12 @@
|
||||||
page_title: "docker_registry_image Resource - terraform-provider-docker"
|
page_title: "docker_registry_image Resource - terraform-provider-docker"
|
||||||
subcategory: ""
|
subcategory: ""
|
||||||
description: |-
|
description: |-
|
||||||
Manages the lifecycle of docker image/tag in a registry.
|
Manages the lifecycle of docker image/tag in a registry means it can store one or more version of specific docker images and identified by their tags.
|
||||||
---
|
---
|
||||||
<!-- Bug: Type and Name are switched -->
|
<!-- Bug: Type and Name are switched -->
|
||||||
# docker_registry_image (Resource)
|
# docker_registry_image (Resource)
|
||||||
|
|
||||||
Manages the lifecycle of docker image/tag in a registry means it can store one or more version
|
Manages the lifecycle of docker image/tag in a registry means it can store one or more version of specific docker images and identified by their tags.
|
||||||
of specific docker images and identified by their tags.
|
|
||||||
|
|
||||||
## Example Usage
|
## Example Usage
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ func resourceDockerContainer() *schema.Resource {
|
||||||
|
|
||||||
"rm": {
|
"rm": {
|
||||||
Type: schema.TypeBool,
|
Type: schema.TypeBool,
|
||||||
Description: "If `true`, then the container will be automatically removed after his execution. Terraform won't check this container after creation. Defaults to `false`.",
|
Description: "If `true`, then the container will be automatically removed when it exits. Defaults to `false`.",
|
||||||
Default: false,
|
Default: false,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -824,32 +824,39 @@ func resourceDockerContainerUpdate(ctx context.Context, d *schema.ResourceData,
|
||||||
func resourceDockerContainerDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
|
func resourceDockerContainerDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
|
||||||
client := meta.(*ProviderConfig).DockerClient
|
client := meta.(*ProviderConfig).DockerClient
|
||||||
|
|
||||||
if d.Get("rm").(bool) {
|
|
||||||
d.SetId("")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if !d.Get("attach").(bool) {
|
if !d.Get("attach").(bool) {
|
||||||
// Stop the container before removing if destroy_grace_seconds is defined
|
// Stop the container before removing if destroy_grace_seconds is defined
|
||||||
|
var timeout time.Duration
|
||||||
if d.Get("destroy_grace_seconds").(int) > 0 {
|
if d.Get("destroy_grace_seconds").(int) > 0 {
|
||||||
timeout := time.Duration(int32(d.Get("destroy_grace_seconds").(int))) * time.Second
|
timeout = time.Duration(int32(d.Get("destroy_grace_seconds").(int))) * time.Second
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("[INFO] Stopping Container '%s' with timeout %v", d.Id(), timeout)
|
||||||
if err := client.ContainerStop(ctx, d.Id(), &timeout); err != nil {
|
if err := client.ContainerStop(ctx, d.Id(), &timeout); err != nil {
|
||||||
return diag.Errorf("Error stopping container %s: %s", d.Id(), err)
|
return diag.Errorf("Error stopping container %s: %s", d.Id(), err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
removeOpts := types.ContainerRemoveOptions{
|
removeOpts := types.ContainerRemoveOptions{
|
||||||
RemoveVolumes: d.Get("remove_volumes").(bool),
|
RemoveVolumes: d.Get("remove_volumes").(bool),
|
||||||
|
RemoveLinks: d.Get("rm").(bool),
|
||||||
Force: true,
|
Force: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Printf("[INFO] Removing Container '%s'", d.Id())
|
||||||
if err := client.ContainerRemove(ctx, d.Id(), removeOpts); err != nil {
|
if err := client.ContainerRemove(ctx, d.Id(), removeOpts); err != nil {
|
||||||
|
if !containsIgnorableErrorMessage(err.Error(), "No such container", "is already in progress") {
|
||||||
return diag.Errorf("Error deleting container %s: %s", d.Id(), err)
|
return diag.Errorf("Error deleting container %s: %s", d.Id(), err)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
waitOkC, errorC := client.ContainerWait(ctx, d.Id(), container.WaitConditionRemoved)
|
waitCondition := container.WaitConditionNotRunning
|
||||||
|
if d.Get("rm").(bool) {
|
||||||
|
waitCondition = container.WaitConditionRemoved
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("[INFO] Waiting for Container '%s' with condition '%s'", d.Id(), waitCondition)
|
||||||
|
waitOkC, errorC := client.ContainerWait(ctx, d.Id(), waitCondition)
|
||||||
select {
|
select {
|
||||||
case waitOk := <-waitOkC:
|
case waitOk := <-waitOkC:
|
||||||
log.Printf("[INFO] Container exited with code [%v]: '%s'", waitOk.StatusCode, d.Id())
|
log.Printf("[INFO] Container exited with code [%v]: '%s'", waitOk.StatusCode, d.Id())
|
||||||
|
|
@ -857,6 +864,7 @@ func resourceDockerContainerDelete(ctx context.Context, d *schema.ResourceData,
|
||||||
if !containsIgnorableErrorMessage(err.Error(), "No such container", "is already in progress") {
|
if !containsIgnorableErrorMessage(err.Error(), "No such container", "is already in progress") {
|
||||||
return diag.Errorf("Error waiting for container removal '%s': %s", d.Id(), err)
|
return diag.Errorf("Error waiting for container removal '%s': %s", d.Id(), err)
|
||||||
}
|
}
|
||||||
|
log.Printf("[INFO] Waiting for Container '%s' errord: '%s'", d.Id(), err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
d.SetId("")
|
d.SetId("")
|
||||||
|
|
|
||||||
|
|
@ -1730,7 +1730,9 @@ func testAccContainerWaitConditionRemoved(ctx context.Context, n string, ct *typ
|
||||||
select {
|
select {
|
||||||
case err := <-errC:
|
case err := <-errC:
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Container has not been removed")
|
if !containsIgnorableErrorMessage(err.Error(), "No such container", "is already in progress") {
|
||||||
|
return fmt.Errorf("Container has not been removed: '%s'", err.Error())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case <-statusC:
|
case <-statusC:
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import (
|
||||||
|
|
||||||
func resourceDockerRegistryImage() *schema.Resource {
|
func resourceDockerRegistryImage() *schema.Resource {
|
||||||
return &schema.Resource{
|
return &schema.Resource{
|
||||||
Description: "Manages the lifecycle of docker image/tag in a registry.",
|
Description: "Manages the lifecycle of docker image/tag in a registry means it can store one or more version of specific docker images and identified by their tags.",
|
||||||
|
|
||||||
CreateContext: resourceDockerRegistryImageCreate,
|
CreateContext: resourceDockerRegistryImageCreate,
|
||||||
ReadContext: resourceDockerRegistryImageRead,
|
ReadContext: resourceDockerRegistryImageRead,
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,8 @@ description: |-
|
||||||
|
|
||||||
## Example Usage
|
## Example Usage
|
||||||
|
|
||||||
|
To be able to update an image itself when an updated image arrives.
|
||||||
|
|
||||||
{{tffile "examples/resources/docker_registry_image/resource.tf"}}
|
{{tffile "examples/resources/docker_registry_image/resource.tf"}}
|
||||||
|
|
||||||
{{ .SchemaMarkdown | trimspace }}
|
{{ .SchemaMarkdown | trimspace }}
|
||||||
Loading…
Reference in a new issue