Learn what Terraform import is and how to use it.
Follow along with the Learn Guide at HashiCorp Learn.
- Terraform: https://www.terraform.io/downloads.html
- Docker: https://docs.docker.com/get-docker/
-
Run this docker command to create a container with the latest nginx image.
docker run --name hashicorp-learn --detach --publish 8080:80 nginx:latest
-
Verify container is running by running
docker ps
or visiting0.0.0.0:8080
in your web browser.docker ps --filter "name=hashicorp-learn"
-
Initialize your workspace by running
terraform init
. -
Add empty resource stub to
docker.tf
for the container.resource "docker_container" "web" { }
-
Import the container into Terraform state.
terraform import docker_container.web $(docker inspect -f {{.ID}} hashicorp-learn)
-
Now the container is in your terraform configuration's state.
terraform show
-
Run
terraform plan
. Terraform shows errors for missing required arguments (image
,name
).terraform plan
-
Generate configuration and save it in
docker.tf
, replacing the empty resource created earlier.terraform show -no-color > docker.tf
-
Re-run
terraform plan
.terraform plan
-
Terraform will show warnings and errors about a deprecated attribute (
links
), and several read-only attributes (ip_address
,network_data
,gateway
,ip_prefix_length
,id
). Remove these attributes fromdocker.tf
. -
Re-run
terraform plan
.terraform plan
It should now execute successfully. The plan indicates that Terraform will update in place to add the
attach
,logs
,must_run
, andstart
attributes. Notice that the container resource will not be replaced. -
Apply the changes. Remember to confirm the run with a
yes
.terraform apply
-
There are now several attributes in
docker.tf
that are unnecessary because they are the same as their default values. After removing these attributes,docker.tf
will look something like the following.# docker_container.web: resource "docker_container" "web" { name = "hashicorp-learn" image = "sha256:9beeba249f3ee158d3e495a6ac25c5667ae2de8a43ac2a8bfd2bf687a58c06c9" ports { external = 8080 internal = 80 } }
-
Run
terraform plan
again to verify that removing these attributes did not change the configuration.terraform plan
$ docker ps --filter "name=hashicorp-learn"
You can revisit `0.0.0.0:8080` in your web browser to verify that it is
still up. Also note the "Status" - the container has been up and running
since it was created, so you know that it was not restarted when you
imported it into Terraform.
-
Retrieve the image's tag name by running the following command, replacing the sha256 value shown with the one from
docker.tf
.docker image inspect sha256:602e111c06b6934013578ad80554a074049c59441d9bcd963cb4a7feccede7a -f {{.RepoTags}}
-
Add the following configuration to your docker.tf file.
resource "docker_image" "nginx" { name = "nginx:latest" }
-
Run
terraform apply
to apply the changes. Remember to confirm the run with ayes
.terraform apply
-
Now that Terraform has created a resource for the image, refer to it in
docker.tf
like so:resource "docker_container" "web" { name = "hashicorp-learn" image = docker_image.nginx.latest # File truncated...
-
Verify that your configuration matches the current state.
terraform apply
-
In your
docker.tf
file, change the container's external port from8080
to8081
.resource "docker_container" "web" { name = "hashicorp-learn" image = "sha256:602e111c06b6934013578ad80554a074049c59441d9bcd963cb4a7feccede7a5" ports { external = 8081 internal = 80 } }
-
Apply the change. Remember to confirm the run with a
yes
.terraform apply
-
Verify that the new container works by running
docker ps
or visiting0.0.0.0:8081
in your web browser.docker ps --filter "name=hashicorp-learn"
-
Run
terraform destroy
to destroy the container. Remember to confirm destruction with ayes
.terraform destroy
-
Run
docker ps
to validate that the container was destroyed.docker ps --filter "name=hashicorp-learn"