terraform-provider-docker icon indicating copy to clipboard operation
terraform-provider-docker copied to clipboard

docs(r/container): fix the example to keep container running

Open suzuki-shunsuke opened this issue 2 years ago • 1 comments

Problem to solve

When you apply the example usage of docker_container, the container exists soon and the apply fails.

https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs/resources/container#example-usage

So you have to fix the example usage.

How to reproduce

$ terraform version
Terraform v1.1.7
on darwin_amd64

main.tf

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "2.16.0"
    }
  }
}

provider "docker" {}

resource "docker_container" "ubuntu" {
  name    = "foo"
  image   = docker_image.ubuntu.latest
}

resource "docker_image" "ubuntu" {
  name = "ubuntu:precise"
}
$ terraform apply

Then the following error occurs.

docker_image.ubuntu: Creating...
docker_image.ubuntu: Still creating... [10s elapsed]
docker_image.ubuntu: Creation complete after 12s [id=sha256:5b117edd0b767986092e9f721ba2364951b0a271f53f1f41aff9dd1861c2d4feubuntu:precise]
docker_container.ubuntu: Creating...
╷
│ Error: container exited immediately
│ 
│   with docker_container.ubuntu,
│   on main.tf line 12, in resource "docker_container" "ubuntu":
│   12: resource "docker_container" "ubuntu" {
│ 
╵
$ terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # docker_container.ubuntu will be created
  + resource "docker_container" "ubuntu" {
      + attach           = false
      + bridge           = (known after apply)
      + command          = (known after apply)
      + container_logs   = (known after apply)
      + entrypoint       = (known after apply)
      + env              = (known after apply)
      + exit_code        = (known after apply)
      + gateway          = (known after apply)
      + hostname         = (known after apply)
      + id               = (known after apply)
      + image            = (known after apply)
      + init             = (known after apply)
      + ip_address       = (known after apply)
      + ip_prefix_length = (known after apply)
      + ipc_mode         = (known after apply)
      + log_driver       = (known after apply)
      + logs             = false
      + must_run         = true
      + name             = "foo"
      + network_data     = (known after apply)
      + read_only        = false
      + remove_volumes   = true
      + restart          = "no"
      + rm               = false
      + security_opts    = (known after apply)
      + shm_size         = (known after apply)
      + start            = true
      + stdin_open       = false
      + tty              = false

      + healthcheck {
          + interval     = (known after apply)
          + retries      = (known after apply)
          + start_period = (known after apply)
          + test         = (known after apply)
          + timeout      = (known after apply)
        }

      + labels {
          + label = (known after apply)
          + value = (known after apply)
        }
    }

  # docker_image.ubuntu will be created
  + resource "docker_image" "ubuntu" {
      + id          = (known after apply)
      + latest      = (known after apply)
      + name        = "ubuntu:precise"
      + output      = (known after apply)
      + repo_digest = (known after apply)
    }

Plan: 2 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

docker_image.ubuntu: Creating...
docker_image.ubuntu: Still creating... [10s elapsed]
docker_image.ubuntu: Creation complete after 12s [id=sha256:5b117edd0b767986092e9f721ba2364951b0a271f53f1f41aff9dd1861c2d4feubuntu:precise]
docker_container.ubuntu: Creating...
╷
│ Error: container exited immediately
│ 
│   with docker_container.ubuntu,
│   on main.tf line 12, in resource "docker_container" "ubuntu":
│   12: resource "docker_container" "ubuntu" {
│ 
╵

How to solve

To fix the above error, you have to fix the example code. By setting tty, you can fix the error.

Also, you can fix the error by changing command too.

e.g.

resource "docker_container" "ubuntu" {
  name  = "foo"
  image = docker_image.ubuntu.latest
  command = ["tail", "-f", "/dev/null"]
}

Reference

  • https://github.com/kreuzwerker/terraform-provider-docker/issues/362
  • https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs/resources/container

suzuki-shunsuke avatar Mar 24 '22 00:03 suzuki-shunsuke

This does not resolve the problem - which is that both "must_run" and "start" are ignored despite being (by default) set to true - and even when explicitly set to true.

Meanwhile the command/tty lines are documented to do other things altogether, and this 'fix' is (AFAIK) effectively engineering a side effect of tty/command.

MrBenGriffin avatar Mar 24 '22 10:03 MrBenGriffin