Learn how to import existing resources under Terraform's management.
Follow along with the Learn Terraform Import tutorial.
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 visiting 0.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.
Run terraform plan
. Terraform shows errors for missing required arguments (image
, name
).
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 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 from docker.tf
.
Re-run terraform plan
.
It should now execute successfully. The plan indicates that Terraform will update in place to add the attach
, logs
, must_run
, and start
attributes. Notice that the container resource will not be replaced.
Apply the changes. Remember to confirm the run with a yes
.
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.
$ 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.
Create a Docker image resource
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 a yes
.
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.
In your docker.tf
file, change the container's external port from 8080
to 8081
.
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
.
Verify that the new container works by running docker ps
or visiting 0.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 a yes
.
Run docker ps
to validate that the container was destroyed.
docker ps --filter "name=hashicorp-learn"
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4