coder / coder/internal

Terraform Resources for Dev Containers

Open
#1,237 1 comment 0 reactions 0 assignees View on GitHub
epic
Dominant language
No language data
Stars
3
Forks
0
PR merge metrics
No merged PRs in 30d

Description

# Epic: Terraform Resources for Dev Containers

## Summary

Enable template authors to attach Terraform resources (`coder_app`, `coder_script`, `coder_env`, `coder_ai_task`) to `coder_devcontainer` resources, eliminating the need to choose between Dev Containers and our collection of Terraform modules.

## Problem Statement

**Opting in** to Dev Containers requires **opting out** of our collection of Terraform modules as there is no way of associating terraform resources to the `coder_devcontainer` resource.

Agents used for Dev Containers are created dynamically *after* workspace provisioning. Since the sub-agent doesn't exist at Terraform plan/apply time, there is no way to reference it in Terraform.

## Solution Overview

### Phase 1: Terraform-defined Resources

Introduce a computed `subagent_id` field on the `coder_devcontainer` resource that can be referenced by other Terraform resources. This ID is pre-computed at plan time and used when the sub-agent is created at runtime.

```hcl
resource "coder_devcontainer" "main" {
agent_id = coder_agent.main.id
workspace_folder = "/workspaces/project"
}

resource "coder_app" "code_server" {
agent_id = coder_devcontainer.main.subagent_id
slug = "code-server"
display_name = "VS Code"
url = "http://localhost:8080"
}
```

### Phase 2: `devcontainer.json`-defined Resources

Enable Terraform modules to be defined directly in `devcontainer.json` via `customizations.coder.modules`, allowing developers to attach modules to their dev container without modifying Terraform templates. The modules are provisioned by coderd using `coder/preview`.

```json
{
"customizations": {
"coder": {
"modules": {
"registry.coder.com/coder/code-server/coder:1.0.0": {},
"registry.coder.com/coder/zed/coder:1": {
"folder": "/home/coder/coder"
}
}
}
}
}
```

The key format is `:` and the value is an object of key-value mappings where each key is translated into a Terraform variable.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.