@@ -338,6 +338,135 @@ resource "docker_container" "workspace" {
338
338
}
339
339
```
340
340
341
+ <details >
342
+ <summary >Expand for the full `main.tf` file</summary >
343
+ ``` tf
344
+ terraform {
345
+ required_providers {
346
+ coder = {
347
+ source = "coder/coder"
348
+ }
349
+ docker = {
350
+ source = "kreuzwerker/docker"
351
+ }
352
+ }
353
+ }
354
+
355
+ locals {
356
+ username = data.coder_workspace_owner.me.name
357
+ }
358
+
359
+ data "coder_provisioner" "me" {
360
+ }
361
+
362
+ provider "docker" {
363
+ }
364
+
365
+ provider "coder" {
366
+ }
367
+
368
+ data "coder_workspace" "me" {
369
+ }
370
+
371
+ data "coder_workspace_owner" "me" {}
372
+
373
+ resource "coder_agent" "main" {
374
+ arch = data.coder_provisioner.me.arch
375
+ os = "linux"
376
+ startup_script = <<-EOT
377
+ set -e
378
+
379
+ # install and start code-server
380
+ curl -fsSL https://code-server.dev/install.sh | sh -s -- --method=standalone --prefix=/tmp/code-server
381
+ /tmp/code-server/bin/code-server --auth none --port 13337 >/tmp/code-server.log 2>&1 &
382
+ EOT
383
+
384
+ env = {
385
+ GIT_AUTHOR_NAME = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
386
+ GIT_AUTHOR_EMAIL = "${data.coder_workspace_owner.me.email}"
387
+ GIT_COMMITTER_NAME = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
388
+ GIT_COMMITTER_EMAIL = "${data.coder_workspace_owner.me.email}"
389
+ }
390
+
391
+ metadata {
392
+ display_name = "CPU Usage"
393
+ key = "0_cpu_usage"
394
+ script = "coder stat cpu"
395
+ interval = 10
396
+ timeout = 1
397
+ }
398
+
399
+ metadata {
400
+ display_name = "RAM Usage"
401
+ key = "1_ram_usage"
402
+ script = "coder stat mem"
403
+ interval = 10
404
+ timeout = 1
405
+ }
406
+ }
407
+
408
+ resource "coder_app" "code-server" {
409
+ agent_id = coder_agent.main.id
410
+ slug = "code-server"
411
+ display_name = "code-server"
412
+ url = "http://localhost:13337/?folder=/home/${local.username}"
413
+ icon = "/icon/code.svg"
414
+ subdomain = false
415
+ share = "owner"
416
+
417
+ healthcheck {
418
+ url = "http://localhost:13337/healthz"
419
+ interval = 5
420
+ threshold = 6
421
+ }
422
+ }
423
+
424
+ resource "docker_volume" "home_volume" {
425
+ name = "coder-${data.coder_workspace.me.id}-home"
426
+ # Protect the volume from being deleted due to changes in attributes.
427
+ lifecycle {
428
+ ignore_changes = all
429
+ }
430
+ }
431
+
432
+ resource "docker_image" "main" {
433
+ name = "coder-${data.coder_workspace.me.id}"
434
+ build {
435
+ context = "./build"
436
+ build_args = {
437
+ USER = local.username
438
+ }
439
+ }
440
+ triggers = {
441
+ dir_sha1 = sha1(join("", [for f in fileset(path.module, "build/*") : filesha1(f)]))
442
+ }
443
+ }
444
+
445
+ resource "docker_container" "workspace" {
446
+ count = data.coder_workspace.me.start_count
447
+ image = docker_image.main.name
448
+ # Uses lower() to avoid Docker restriction on container names.
449
+ name = "coder-${data.coder_workspace_owner.me.name}-${lower(data.coder_workspace.me.name)}"
450
+ # Hostname makes the shell more user friendly: coder@my-workspace:~$
451
+ hostname = data.coder_workspace.me.name
452
+ # Use the docker gateway if the access URL is 127.0.0.1
453
+ entrypoint = ["sh", "-c", replace(coder_agent.main.init_script, "/localhost|127\\.0\\.0\\.1/", "host.docker.internal")]
454
+ env = [
455
+ "CODER_AGENT_TOKEN=${coder_agent.main.token}",
456
+ ]
457
+ host {
458
+ host = "host.docker.internal"
459
+ ip = "host-gateway"
460
+ }
461
+ volumes {
462
+ container_path = "/home/${local.username}"
463
+ volume_name = docker_volume.home_volume.name
464
+ read_only = false
465
+ }
466
+ }
467
+ ```
468
+ </details >
469
+
341
470
## 7. Create the template in Coder
342
471
343
472
Save ` main.tf ` and exit the editor.
0 commit comments