coder / coder/envbuilder

Example: Using `devcontainer.json` to influence a Coder (Terraform) template

未关闭
#121 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
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

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。