| --- |
| page_title: Initializing Working Directories - Terraform CLI |
| description: >- |
| Working directories contain configurations, settings, cached plugins and |
| modules, and state data. Learn how to initialize and manage working |
| directories. |
| --- |
| |
| # Initializing Working Directories |
| |
| Terraform expects to be invoked from a working directory that contains |
| configuration files written in |
| [the Terraform language](/language). Terraform uses |
| configuration content from this directory, and also uses the directory to store |
| settings, cached plugins and modules, and sometimes state data. |
| |
| A working directory must be initialized before Terraform can perform any |
| operations in it (like provisioning infrastructure or modifying state). |
| |
| ## Working Directory Contents |
| |
| A Terraform working directory typically contains: |
| |
| - A Terraform configuration describing resources Terraform should manage. This |
| configuration is expected to change over time. |
| - A hidden `.terraform` directory, which Terraform uses to manage cached |
| provider plugins and modules, record which |
| [workspace](/cli/workspaces) is currently active, and |
| record the last known backend configuration in case it needs to migrate state |
| on the next run. This directory is automatically managed by Terraform, and is |
| created during initialization. |
| - State data, if the configuration uses the default `local` backend. This is |
| managed by Terraform in a `terraform.tfstate` file (if the directory only uses |
| the default workspace) or a `terraform.tfstate.d` directory (if the directory |
| uses multiple workspaces). |
| |
| ## Initialization |
| |
| Run the `terraform init` command to initialize a working directory that contains |
| a Terraform configuration. After initialization, you will be able to perform |
| other commands, like `terraform plan` and `terraform apply`. |
| |
| If you try to run a command that relies on initialization without first |
| initializing, the command will fail with an error and explain that you need to |
| run init. |
| |
| Initialization performs several tasks to prepare a directory, including |
| accessing state in the configured backend, downloading and installing provider |
| plugins, and downloading modules. Under some conditions (usually when changing |
| from one backend to another), it might ask the user for guidance or |
| confirmation. |
| |
| For details, see [the `terraform init` command](/cli/commands/init). |
| |
| ## Reinitialization |
| |
| Certain types of changes to a Terraform configuration can require |
| reinitialization before normal operations can continue. This includes changes to |
| provider requirements, module sources or version constraints, and backend |
| configurations. |
| |
| You can reinitialize a directory by running `terraform init` again. In fact, you |
| can reinitialize at any time; the init command is idempotent, and will have no |
| effect if no changes are required. |
| |
| If reinitialization is required, any commands that rely on initialization will |
| fail with an error and tell you so. |
| |
| ## Reinitializing Only Modules |
| |
| The `terraform get` command will download modules referenced in the |
| configuration, but will not perform the other required initialization tasks. |
| This command is only useful for niche workflows, and most Terraform users can |
| ignore it in favor of `terraform init`. |