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

Changes to the docker_image resource end in the Error: failed to solve with frontend dockerfile.v0: failed to read dockerfile: Error processing tar file(exit status 1): unexpected EOF

Open six-lang opened this issue 1 year ago • 6 comments

Community Note

  • Please vote on this issue by adding a 👍 reaction to the original issue to help the community and maintainers prioritize this request
  • Please do not leave "+1" or "me too" comments, they generate extra noise for issue followers and do not help prioritize the request
  • If you are interested in working on this issue or have submitted a pull request, please leave a comment

Terraform (and docker Provider) Version

Terraform v1.3.7 on windows_386

  • provider registry.terraform.io/kreuzwerker/docker v2.25.0

Docker Desktop Version

docker version Client: Cloud integration: v1.0.29 Version: 20.10.21 API version: 1.41 Go version: go1.18.7 Git commit: baeda1f Built: Tue Oct 25 18:08:16 2022 OS/Arch: windows/amd64 Context: default Experimental: true

Server: Docker Desktop 4.15.0 (93002) Engine: Version: 20.10.21 API version: 1.41 (minimum version 1.12) Go version: go1.18.7 Git commit: 3056208 Built: Tue Oct 25 18:00:19 2022 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.10 GitCommit: 770bd0108c32f3fb5c73ae1264f7e503fe7b2661 runc: Version: 1.1.4 GitCommit: v1.1.4-0-g5fd4c4d docker-init: Version: 0.19.0 GitCommit: de40ad0

Affected Resource(s)

  • docker_image

Debug Output

docker_image.zoo: Creating... ╷ │ Error: failed to solve with frontend dockerfile.v0: failed to read dockerfile: Error processing tar file(exit status 1): unexpected EOF │ │ │ │ with docker_image.zoo, │ on main.tf line 14, in resource "docker_image" "zoo": │ 14: resource "docker_image" "zoo" { │ ╵

Expected Behaviour

No Error and rebuild docker image.

Actual Behaviour

A change to main.tf triggers a Docker image build and ends with an error message.

Steps to Reproduce

  1. Dockerfile
FROM ubuntu

RUN echo "while true; do date; sleep 10; done" > /start.sh && chmod 775 /start.sh

CMD	["/bin/sh", "-c", "/start.sh"]
  1. terraform main.tf
terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = ">= 2.25.0"
    }
  }
}

provider "docker" {
}

resource "docker_image" "zoo" {
  name = "zoo"
  keep_locally = true
  build {
    context = "${path.cwd}/."
    label = {
      author : "test"
    }
  }
}

resource "docker_container" "zoo" {
  image = docker_image.zoo.latest
  name  = "zoo"
}
  1. terraform init
Initializing the backend...

Initializing provider plugins...
- Finding kreuzwerker/docker versions matching ">= 2.25.0"...
- Installing kreuzwerker/docker v2.25.0...
- Installed kreuzwerker/docker v2.25.0 (self-signed, key ID BD080C4571C6104C)

...
Terraform has been successfully initialized!
...
  1. first 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.zoo will be created
  + resource "docker_container" "zoo" {
      + attach                                      = false
      + bridge                                      = (known after apply)
      + command                                     = (known after apply)
      + container_logs                              = (known after apply)
      + container_read_refresh_timeout_milliseconds = 15000
      + 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                                        = "zoo"
      + network_data                                = (known after apply)
      + read_only                                   = false
      + remove_volumes                              = true
      + restart                                     = "no"
      + rm                                          = false
      + runtime                                     = (known after apply)
      + security_opts                               = (known after apply)
      + shm_size                                    = (known after apply)
      + start                                       = true
      + stdin_open                                  = false
      + stop_signal                                 = (known after apply)
      + stop_timeout                                = (known after apply)
      + tty                                         = false
      + wait                                        = false
      + wait_timeout                                = 60

      + 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.zoo will be created
  + resource "docker_image" "zoo" {
      + id           = (known after apply)
      + image_id     = (known after apply)
      + keep_locally = true
      + latest       = (known after apply)
      + name         = "zoo"
      + output       = (known after apply)
      + repo_digest  = (known after apply)

      + build {
          + cache_from   = []
          + context      = "C:/Users/.../ubuntu/."
          + dockerfile   = "Dockerfile"
          + extra_hosts  = []
          + label        = {
              + "author" = "test"
            }
          + remove       = true
          + security_opt = []
          + tag          = []
        }
    }

Plan: 2 to add, 0 to change, 0 to destroy.
╷
│ Warning: Deprecated attribute
│
│   on main.tf line 25, in resource "docker_container" "zoo":
│   25:   image = docker_image.zoo.latest
│
│ The attribute "latest" is deprecated. Refer to the provider documentation for details.
│
│ (and one more similar warning elsewhere)
╵

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.zoo: Creating...
docker_image.zoo: Creation complete after 2s [id=sha256:ddfc623f4b0fcd93eb5b4f1dfc4d454b4072ed066905f60b6ec2829d8e2f9cf6zoo]
docker_container.zoo: Creating...
docker_container.zoo: Creation complete after 1s [id=403260e5d04c88addc7216881380e6ef3ad8f06b8c68582f0a93eb63cd439759]
╷
│ Warning: Deprecated attribute
│
│   on main.tf line 25, in resource "docker_container" "zoo":
│   25:   image = docker_image.zoo.latest
│
│ The attribute "latest" is deprecated. Refer to the provider documentation for details.
│
│ (and one more similar warning elsewhere)
╵

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
  1. Change the main.tf e.g. docker_image.build.label.author
  2. second terraform apply
docker_image.zoo: Refreshing state... [id=sha256:ddfc623f4b0fcd93eb5b4f1dfc4d454b4072ed066905f60b6ec2829d8e2f9cf6zoo]
docker_container.zoo: Refreshing state... [id=403260e5d04c88addc7216881380e6ef3ad8f06b8c68582f0a93eb63cd439759]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # docker_container.zoo must be replaced
-/+ resource "docker_container" "zoo" {
      + bridge                                      = (known after apply)
      ~ command                                     = [
          - "/bin/sh",
          - "-c",
          - "/start.sh",
        ] -> (known after apply)
      + container_logs                              = (known after apply)
      - cpu_shares                                  = 0 -> null
      - dns                                         = [] -> null
      - dns_opts                                    = [] -> null
      - dns_search                                  = [] -> null
      ~ entrypoint                                  = [] -> (known after apply)
      ~ env                                         = [] -> (known after apply)
      + exit_code                                   = (known after apply)
      ~ gateway                                     = "192.168.0.1" -> (known after apply)
      - group_add                                   = [] -> null
      ~ hostname                                    = "403260e5d04c" -> (known after apply)
      ~ id                                          = "403260e5d04c88addc7216881380e6ef3ad8f06b8c68582f0a93eb63cd439759" -> (known after apply)
      ~ image                                       = "sha256:ddfc623f4b0fcd93eb5b4f1dfc4d454b4072ed066905f60b6ec2829d8e2f9cf6" -> (known after apply) # forces replacement
      ~ init                                        = false -> (known after apply)
      ~ ip_address                                  = "192.168.0.3" -> (known after apply)
      ~ ip_prefix_length                            = 24 -> (known after apply)
      ~ ipc_mode                                    = "private" -> (known after apply)
      - links                                       = [] -> null
      ~ log_driver                                  = "json-file" -> (known after apply)
      - log_opts                                    = {} -> null
      - max_retry_count                             = 0 -> null
      - memory                                      = 0 -> null
      - memory_swap                                 = 0 -> null
        name                                        = "zoo"
      ~ network_data                                = [
          - {
              - gateway                   = "192.168.0.1"
              - global_ipv6_address       = ""
              - global_ipv6_prefix_length = 0
              - ip_address                = "192.168.0.3"
              - ip_prefix_length          = 24
              - ipv6_gateway              = ""
              - network_name              = "bridge"
            },
        ] -> (known after apply)
      - network_mode                                = "default" -> null
      - privileged                                  = false -> null
      - publish_all_ports                           = false -> null
      ~ runtime                                     = "runc" -> (known after apply)
      ~ security_opts                               = [] -> (known after apply)
      ~ shm_size                                    = 64 -> (known after apply)
      + stop_signal                                 = (known after apply)
      ~ stop_timeout                                = 0 -> (known after apply)
      - storage_opts                                = {} -> null
      - sysctls                                     = {} -> null
      - tmpfs                                       = {} -> null
        # (13 unchanged attributes hidden)

      + 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.zoo must be replaced
-/+ resource "docker_image" "zoo" {
      ~ id           = "sha256:ddfc623f4b0fcd93eb5b4f1dfc4d454b4072ed066905f60b6ec2829d8e2f9cf6zoo" -> (known after apply)
      ~ image_id     = "sha256:ddfc623f4b0fcd93eb5b4f1dfc4d454b4072ed066905f60b6ec2829d8e2f9cf6" -> (known after apply)
      ~ latest       = "sha256:ddfc623f4b0fcd93eb5b4f1dfc4d454b4072ed066905f60b6ec2829d8e2f9cf6" -> (known after apply)
        name         = "zoo"
      + output       = (known after apply)
      + repo_digest  = (known after apply)
        # (1 unchanged attribute hidden)

      - build { # forces replacement
          - build_arg       = {} -> null
          - build_args      = {} -> null
          - cache_from      = [] -> null
          - context         = "C:/Users/.../ubuntu/." -> null
          - cpu_period      = 0 -> null
          - cpu_quota       = 0 -> null
          - cpu_shares      = 0 -> null
          - dockerfile      = "Dockerfile" -> null
          - extra_hosts     = [] -> null
          - force_remove    = false -> null
          - label           = {
              - "author" = "test"
            } -> null
          - labels          = {} -> null
          - memory          = 0 -> null
          - memory_swap     = 0 -> null
          - no_cache        = false -> null
          - pull_parent     = false -> null
          - remove          = true -> null
          - security_opt    = [] -> null
          - shm_size        = 0 -> null
          - squash          = false -> null
          - suppress_output = false -> null
          - tag             = [] -> null
        }
      + build { # forces replacement
          + cache_from   = []
          + context      = "C:/Users/.../ubuntu/."
          + dockerfile   = "Dockerfile"
          + extra_hosts  = []
          + label        = {
              + "author" = "test2"
            }
          + remove       = true
          + security_opt = []
          + tag          = []
        }
    }

Plan: 2 to add, 0 to change, 2 to destroy.
╷
│ Warning: Deprecated attribute
│
│   on main.tf line 25, in resource "docker_container" "zoo":
│   25:   image = docker_image.zoo.latest
│
│ The attribute "latest" is deprecated. Refer to the provider documentation for details.
│
│ (and one more similar warning elsewhere)
╵

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_container.zoo: Destroying... [id=403260e5d04c88addc7216881380e6ef3ad8f06b8c68582f0a93eb63cd439759]
docker_container.zoo: Destruction complete after 1s
docker_image.zoo: Destroying... [id=sha256:ddfc623f4b0fcd93eb5b4f1dfc4d454b4072ed066905f60b6ec2829d8e2f9cf6zoo]
docker_image.zoo: Destruction complete after 0s
docker_image.zoo: Creating...
╷
│ Error: failed to solve with frontend dockerfile.v0: failed to read dockerfile: Error processing tar file(exit status 1): unexpected EOF
│
│
│
│   with docker_image.zoo,
│   on main.tf line 13, in resource "docker_image" "zoo":
│   13: resource "docker_image" "zoo" {
│
╵

All subsequent terraform apply will give the same result.

By deleting the terraform.tfstate file, you can start over with the same result.

Important Factoids

  • Docker Desktop Windows configuration
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": false
  }
}
  • enable or disable the buildkit has no effect
  • enable or disable of firewall and virus scanner has no effect

References

nothing really comparable found on the net

  • #0000

six-lang avatar Jan 12 '23 11:01 six-lang