Example: Using `devcontainer.json` to influence a Coder (Terraform) template
- 主要语言
- Go
- 星标
- 300
- 派生
- 64
- 平均合并
- 20 分钟
- 30 天内合并 PR
- 1
描述
> [!NOTE]
> I'm not sure how realistic this is, or whether it should be out of scope envbuilder as it's likely a Terraform provider/Coder feature. However, this is a somewhat common use case. It may not be a good fit for envbuilder v1.0 but worth discussing
Since envbuilder is a container image, it cannot influence the underlying infrastructure it can be provisioned on. However some Dev Container features do have support for additional infrastructure layers. Can we provide an example of how a Coder template can read a devcontainer.json and then influence the template? We have some customers doing this today with a custom `coder.yaml`
## Example: Kubernetes Volume Mounts
```hcl
# The jank approach (pseudocode, untested)
data "http" "devcontainer_contents" {
url = "${var.git_repo}/${var.git_branch}/.devcontainer/devcontainer.json"
request_headers = {
Accept = "application/vnd.github.v3.raw"
}
}
locals {
# Attempt to parse mounts from the devcontainer JSON
parsed_mounts = try(jsondecode(data.http.devcontainer_contents.body).mounts, [])
# Use a default mount if no mounts are specified or if the mounts key doesn't exist
mounts = length(local.parsed_mounts) > 0 ? local.parsed_mounts : ["source=workspace,target=/workspaces,type=volume"]
# Extracting target paths for PVC creation and Pod mounts
target_paths = [for m in local.mounts : split(",", m)[1]]
target_path_names = { for m in local.target_paths : split("=", m)[1] => split("=", m)[1] }
}
resource "kubernetes_persistent_volume_claim" "pvc" {
for_each = local.target_path_names
metadata {
name = "pvc-${replace(each.value, "/", "-")}"
}
spec {
access_modes = ["ReadWriteOnce"]
resources {
requests = {
storage = "1Gi"
}
}
}
}
resource "kubernetes_pod" "example" {
metadata {
name = "example-pod"
}
spec {
container {
image = "nginx"
name = "example"
volume_mount {
for_each = local.target_path_names
name = "pvc-${replace(each.value, "/", "-")}"
mount_path = each.value
}
}
volume {
for_each = local.target_path_names
name = "pvc-${replace(each.value, "/", "-")}"
persistent_volume_claim {
claim_name = "pvc-${replace(each.value, "/", "-")}"
}
}
}
}
image = "nginx"
name = "example"
volume_mount {
for_each = local.target_path_names
name = "pvc-${replace(each.value, "/", "-")}"
mount_path = each.value
}
}
volume {
for_each = local.target_path_names
name = "pvc-${replace(each.value, "/", "-")}"
persistent_volume_claim {
claim_name = "pvc-${replace(each.value, "/", "-")}"
}
}
}
}
```
## Option 2: TF Provider
The Coder server reads the devcontainer.json and passes data via a Terraform data source. This is related to https://github.com/coder/coder/issues/8462.
## Option 3: envbuilder + docker on a VM
If envbuilder runs on a VM, it could realistically do significantly more such as create Docker volumes as well as run a container.
贡献指南
这个仓库没有索引到贡献指南
调研方向
该 issue 没有指出任何仓库文件或测试;请先审阅提议的 Coder Terraform 模板以及所描述的三个选项。要进行贡献,首先需要 maintainer 就范围作出决定,然后提供一个有明确位置和验证路径的、已记录并经过验证的示例。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- docker, kubernetes, terraform
- 领域
- documentation, infrastructure
- Issue 类型
- 文档
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 停滞
- 描述清晰度
- 需要澄清
- 新手友好度
- 25/100