Base.tf
· 4.9 KiB · Terraform
原始文件
terraform {
required_providers {
coder = {
source = "coder/coder"
version = "2.1.2"
}
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0.2"
}
}
}
# Admin parameters
locals {
username = data.coder_workspace_owner.me.name
}
data "coder_provisioner" "me" {
}
provider "docker" {
host = "unix:///var/run/docker.sock"
}
data "coder_workspace" "me" {
}
data "coder_workspace_owner" "me" {
}
data "coder_external_auth" "gitea" {
id = "gitea"
}
data "coder_parameter" "force_rebuild" {
name = "force_rebuild"
type = "bool"
description = "Rebuild the Docker image rather than use the cached one."
mutable = true
default = false
ephemeral = true
}
module "code-server" {
source = "registry.coder.com/modules/code-server/coder"
version = "1.0.28"
agent_id = coder_agent.main.id
display_name = "VS Code"
slug = "code"
install_version = "4.96.4"
folder = "/home/${local.username}/workspace"
port = "8080"
extensions = [
"eamodio.gitlens",
"PKief.material-icon-theme"
]
}
module "personalize" {
source = "registry.coder.com/modules/personalize/coder"
version = "1.0.28"
agent_id = coder_agent.main.id
path = "~/personalize.sh"
}
module "nodejs" {
source = "registry.coder.com/modules/nodejs/coder"
version = "1.0.28"
agent_id = coder_agent.main.id
nvm_install_prefix = "/home/${local.username}/.nvm"
node_versions = [
"20",
"22"
]
default_node_version = "22"
}
module "coder-login" {
source = "registry.coder.com/modules/coder-login/coder"
version = "1.0.28"
agent_id = coder_agent.main.id
}
module "git-config" {
source = "registry.coder.com/modules/git-config/coder"
version = "1.0.28"
agent_id = coder_agent.main.id
allow_username_change = false
}
module "git-commit-signing" {
source = "registry.coder.com/modules/git-commit-signing/coder"
version = "1.0.28"
agent_id = coder_agent.main.id
}
provider "coder" {
}
resource "coder_agent" "main" {
arch = data.coder_provisioner.me.arch
os = "linux"
dir = "/home/${local.username}/workspace/"
}
resource "coder_script" "auto-update" {
agent_id = coder_agent.main.id
script = "/opt/scripts/auto-update.sh"
display_name = "Auto Update"
run_on_start = true
start_blocks_login = false
}
resource "docker_volume" "home_volume" {
name = "coder-${data.coder_workspace.me.id}-home"
# Protect the volume from being deleted due to changes in attributes.
lifecycle {
ignore_changes = all
}
# Add labels in Docker to keep track of orphan resources.
labels {
label = "coder.owner"
value = data.coder_workspace_owner.me.name
}
labels {
label = "coder.owner_id"
value = data.coder_workspace_owner.me.id
}
labels {
label = "coder.workspace_id"
value = data.coder_workspace.me.id
}
# This field becomes outdated if the workspace is renamed but can
# be useful for debugging or cleaning out dangling volumes.
labels {
label = "coder.workspace_name_at_creation"
value = data.coder_workspace.me.name
}
}
resource "docker_image" "main" {
name = "coder-${data.coder_workspace.me.id}"
build {
context = "."
build_args = {
USER = local.username
}
}
triggers = {
docker_sha1 = sha1(filesha1("./Dockerfile"))
terraform_sha1 = sha1(filesha1("./Base.tf"))
rebuild_sha1 = data.coder_parameter.force_rebuild.value
assets_sha1 = sha1(join("", [for f in fileset(path.module, "./assets/*") : filesha1(f)]))
}
}
resource "docker_container" "workspace" {
count = data.coder_workspace.me.start_count
image = docker_image.main.name
# Uses lower() to avoid Docker restriction on container names.
name = "coder-${data.coder_workspace_owner.me.name}-${lower(data.coder_workspace.me.name)}"
# Hostname makes the shell more user friendly: coder@my-workspace:~$
hostname = data.coder_workspace.me.name
# Use the docker gateway if the access URL is 127.0.0.1
entrypoint = ["sh", "-c", replace(coder_agent.main.init_script, "/localhost|127\\.0\\.0\\.1/", "host.docker.internal")]
env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"]
host {
host = "host.docker.internal"
ip = "host-gateway"
}
volumes {
container_path = "/home/${local.username}"
volume_name = docker_volume.home_volume.name
read_only = false
}
# Add labels in Docker to keep track of orphan resources.
labels {
label = "coder.owner"
value = data.coder_workspace_owner.me.name
}
labels {
label = "coder.owner_id"
value = data.coder_workspace_owner.me.id
}
labels {
label = "coder.workspace_id"
value = data.coder_workspace.me.id
}
labels {
label = "coder.workspace_name"
value = data.coder_workspace.me.name
}
}
| 1 | terraform { |
| 2 | required_providers { |
| 3 | coder = { |
| 4 | source = "coder/coder" |
| 5 | version = "2.1.2" |
| 6 | } |
| 7 | docker = { |
| 8 | source = "kreuzwerker/docker" |
| 9 | version = "~> 3.0.2" |
| 10 | } |
| 11 | } |
| 12 | } |
| 13 | |
| 14 | # Admin parameters |
| 15 | |
| 16 | locals { |
| 17 | username = data.coder_workspace_owner.me.name |
| 18 | } |
| 19 | |
| 20 | data "coder_provisioner" "me" { |
| 21 | } |
| 22 | |
| 23 | provider "docker" { |
| 24 | host = "unix:///var/run/docker.sock" |
| 25 | } |
| 26 | |
| 27 | data "coder_workspace" "me" { |
| 28 | } |
| 29 | |
| 30 | data "coder_workspace_owner" "me" { |
| 31 | } |
| 32 | |
| 33 | data "coder_external_auth" "gitea" { |
| 34 | id = "gitea" |
| 35 | } |
| 36 | |
| 37 | data "coder_parameter" "force_rebuild" { |
| 38 | name = "force_rebuild" |
| 39 | type = "bool" |
| 40 | description = "Rebuild the Docker image rather than use the cached one." |
| 41 | mutable = true |
| 42 | default = false |
| 43 | ephemeral = true |
| 44 | } |
| 45 | |
| 46 | module "code-server" { |
| 47 | source = "registry.coder.com/modules/code-server/coder" |
| 48 | version = "1.0.28" |
| 49 | agent_id = coder_agent.main.id |
| 50 | display_name = "VS Code" |
| 51 | slug = "code" |
| 52 | install_version = "4.96.4" |
| 53 | folder = "/home/${local.username}/workspace" |
| 54 | port = "8080" |
| 55 | extensions = [ |
| 56 | "eamodio.gitlens", |
| 57 | "PKief.material-icon-theme" |
| 58 | ] |
| 59 | } |
| 60 | |
| 61 | module "personalize" { |
| 62 | source = "registry.coder.com/modules/personalize/coder" |
| 63 | version = "1.0.28" |
| 64 | agent_id = coder_agent.main.id |
| 65 | path = "~/personalize.sh" |
| 66 | } |
| 67 | |
| 68 | module "nodejs" { |
| 69 | source = "registry.coder.com/modules/nodejs/coder" |
| 70 | version = "1.0.28" |
| 71 | agent_id = coder_agent.main.id |
| 72 | nvm_install_prefix = "/home/${local.username}/.nvm" |
| 73 | node_versions = [ |
| 74 | "20", |
| 75 | "22" |
| 76 | ] |
| 77 | default_node_version = "22" |
| 78 | } |
| 79 | |
| 80 | module "coder-login" { |
| 81 | source = "registry.coder.com/modules/coder-login/coder" |
| 82 | version = "1.0.28" |
| 83 | agent_id = coder_agent.main.id |
| 84 | } |
| 85 | |
| 86 | module "git-config" { |
| 87 | source = "registry.coder.com/modules/git-config/coder" |
| 88 | version = "1.0.28" |
| 89 | agent_id = coder_agent.main.id |
| 90 | allow_username_change = false |
| 91 | } |
| 92 | |
| 93 | module "git-commit-signing" { |
| 94 | source = "registry.coder.com/modules/git-commit-signing/coder" |
| 95 | version = "1.0.28" |
| 96 | agent_id = coder_agent.main.id |
| 97 | } |
| 98 | |
| 99 | provider "coder" { |
| 100 | } |
| 101 | |
| 102 | resource "coder_agent" "main" { |
| 103 | arch = data.coder_provisioner.me.arch |
| 104 | os = "linux" |
| 105 | dir = "/home/${local.username}/workspace/" |
| 106 | } |
| 107 | |
| 108 | resource "coder_script" "auto-update" { |
| 109 | agent_id = coder_agent.main.id |
| 110 | script = "/opt/scripts/auto-update.sh" |
| 111 | display_name = "Auto Update" |
| 112 | run_on_start = true |
| 113 | start_blocks_login = false |
| 114 | } |
| 115 | |
| 116 | resource "docker_volume" "home_volume" { |
| 117 | name = "coder-${data.coder_workspace.me.id}-home" |
| 118 | # Protect the volume from being deleted due to changes in attributes. |
| 119 | lifecycle { |
| 120 | ignore_changes = all |
| 121 | } |
| 122 | # Add labels in Docker to keep track of orphan resources. |
| 123 | labels { |
| 124 | label = "coder.owner" |
| 125 | value = data.coder_workspace_owner.me.name |
| 126 | } |
| 127 | labels { |
| 128 | label = "coder.owner_id" |
| 129 | value = data.coder_workspace_owner.me.id |
| 130 | } |
| 131 | labels { |
| 132 | label = "coder.workspace_id" |
| 133 | value = data.coder_workspace.me.id |
| 134 | } |
| 135 | # This field becomes outdated if the workspace is renamed but can |
| 136 | # be useful for debugging or cleaning out dangling volumes. |
| 137 | labels { |
| 138 | label = "coder.workspace_name_at_creation" |
| 139 | value = data.coder_workspace.me.name |
| 140 | } |
| 141 | } |
| 142 | |
| 143 | resource "docker_image" "main" { |
| 144 | name = "coder-${data.coder_workspace.me.id}" |
| 145 | build { |
| 146 | context = "." |
| 147 | build_args = { |
| 148 | USER = local.username |
| 149 | } |
| 150 | } |
| 151 | triggers = { |
| 152 | docker_sha1 = sha1(filesha1("./Dockerfile")) |
| 153 | terraform_sha1 = sha1(filesha1("./Base.tf")) |
| 154 | rebuild_sha1 = data.coder_parameter.force_rebuild.value |
| 155 | assets_sha1 = sha1(join("", [for f in fileset(path.module, "./assets/*") : filesha1(f)])) |
| 156 | } |
| 157 | } |
| 158 | |
| 159 | resource "docker_container" "workspace" { |
| 160 | count = data.coder_workspace.me.start_count |
| 161 | image = docker_image.main.name |
| 162 | # Uses lower() to avoid Docker restriction on container names. |
| 163 | name = "coder-${data.coder_workspace_owner.me.name}-${lower(data.coder_workspace.me.name)}" |
| 164 | # Hostname makes the shell more user friendly: coder@my-workspace:~$ |
| 165 | hostname = data.coder_workspace.me.name |
| 166 | # Use the docker gateway if the access URL is 127.0.0.1 |
| 167 | entrypoint = ["sh", "-c", replace(coder_agent.main.init_script, "/localhost|127\\.0\\.0\\.1/", "host.docker.internal")] |
| 168 | env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"] |
| 169 | host { |
| 170 | host = "host.docker.internal" |
| 171 | ip = "host-gateway" |
| 172 | } |
| 173 | volumes { |
| 174 | container_path = "/home/${local.username}" |
| 175 | volume_name = docker_volume.home_volume.name |
| 176 | read_only = false |
| 177 | } |
| 178 | # Add labels in Docker to keep track of orphan resources. |
| 179 | labels { |
| 180 | label = "coder.owner" |
| 181 | value = data.coder_workspace_owner.me.name |
| 182 | } |
| 183 | labels { |
| 184 | label = "coder.owner_id" |
| 185 | value = data.coder_workspace_owner.me.id |
| 186 | } |
| 187 | labels { |
| 188 | label = "coder.workspace_id" |
| 189 | value = data.coder_workspace.me.id |
| 190 | } |
| 191 | labels { |
| 192 | label = "coder.workspace_name" |
| 193 | value = data.coder_workspace.me.name |
| 194 | } |
| 195 | } |
| 196 |