You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
# 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 JSONparsed_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 existmounts=length(local.parsed_mounts) >0? local.parsed_mounts: ["source=workspace,target=/workspaces,type=volume"]
# Extracting target paths for PVC creation and Pod mountstarget_paths=[forminlocal.mounts:split(",", m)[1]]
target_path_names={ forminlocal.target_paths:split("=", m)[1] =>split("=", m)[1] }
}
resource"kubernetes_persistent_volume_claim""pvc" {
for_each=local.target_path_namesmetadata {
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_namesname="pvc-${replace(each.value, "/", "-")}"mount_path=each.value
}
}
volume {
for_each=local.target_path_namesname="pvc-${replace(each.value, "/", "-")}"persistent_volume_claim {
claim_name="pvc-${replace(each.value, "/", "-")}"
}
}
}
}
image="nginx"name="example"volume_mount {
for_each=local.target_path_namesname="pvc-${replace(each.value, "/", "-")}"mount_path=each.value
}
}
volume {
for_each=local.target_path_namesname="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 coder/coder#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.
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.yamlExample: Kubernetes Volume Mounts
Option 2: TF Provider
The Coder server reads the devcontainer.json and passes data via a Terraform data source. This is related to coder/coder#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.