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