@@ -43,52 +43,6 @@ data "coder_parameter" "enable_docker" {
43
43
default = true
44
44
}
45
45
46
- data "coder_parameter" "persist_docker" {
47
- type = " bool"
48
- name = " Persist Docker"
49
- mutable = true
50
- default = false
51
- description = <<- EOF
52
- Preserve Docker data across restarts? (true/false)
53
-
54
- This has no effect if 'enable_docker' is false.
55
-
56
- Set this to false (default) if the Docker data should be ephemeral.
57
- All Docker data (images, build cache, containers, networks, etc) will be
58
- lost every time the workspace is stopped. Docker will have access to about
59
- 16Gi of storage.
60
-
61
- Set this to true to persist Docker data under `$HOME`, using the workspace
62
- quota. This can consume large amounts of storage, and needs to be
63
- maintained inside the workspace using the appropriate `docker` commands.
64
-
65
- Some user configuration is normally stored under `$HOME`, and those files
66
- are not affected by this setting and may not be preserved across restarts.
67
- EOF
68
- }
69
-
70
- data "coder_parameter" "docker_version" {
71
- name = " Docker version"
72
- type = " string"
73
- mutable = true
74
- description = <<- EOF
75
- Docker package version to install from https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64
76
- (More information: https://docs.docker.com/engine/install/ubuntu/#install-from-a-package)
77
- EOF
78
- default = " 24.0.5-1"
79
- }
80
-
81
- data "coder_parameter" "docker_compose_version" {
82
- name = " Docker Compose version"
83
- type = " string"
84
- mutable = true
85
- description = <<- EOF
86
- Docker Compose package version to install from https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64
87
- (More information: https://docs.docker.com/engine/install/ubuntu/#install-from-a-package)
88
- EOF
89
- default = " 2.20.2-1"
90
- }
91
-
92
46
data "coder_parameter" "user_shell" {
93
47
name = " User Shell"
94
48
description = <<- EOF
@@ -110,7 +64,7 @@ data "coder_parameter" "dotfiles_uri" {
110
64
111
65
This will be applied on every workstation start, and may overwrite existing
112
66
files. If you prefer to run it only once, leave this blank and run
113
- `/tmp/coder.?????? /coder dotfiles URL` inside the workspace terminal instead.
67
+ `$HOME/bin /coder dotfiles URL` inside the workspace terminal instead.
114
68
EOF
115
69
default = " "
116
70
}
@@ -122,40 +76,27 @@ data "coder_parameter" "extra_package_list" {
122
76
description = <<- EOF
123
77
A list of Ubuntu packages to install.
124
78
125
- Docker and docker-compose packages will be removed and replaced with upstream
126
- packages.
127
-
128
79
These packages are installed during every workspace startup and may cause delays
129
80
before the workspace is available.
130
81
131
- The default includes some basic command-line tools for networking, file viewing and
132
- editing, plus the fish shell and Python 3. This takes approximately 2 minutes to install.
133
82
EOF
134
- default = jsonencode ([
135
- " python-is-python3" ,
136
- " python3-minimal" ,
137
- " python3-pip" ,
138
- " dnsutils" ,
139
- " diffstat" ,
140
- " most" ,
141
- " curl" ,
142
- " wget" ,
143
- " psmisc" ,
144
- " vim-nox" ,
145
- " clang-format" ,
146
- " grc" ,
147
- " fzy" ,
148
- " netcat" ,
149
- " fish" ,
150
- ])
83
+ default = jsonencode ([])
84
+ }
85
+
86
+ data "coder_parameter" "image" {
87
+ type = " string"
88
+ name = " Docker Image"
89
+ description = " Docker image"
90
+ mutable = true
91
+ default = " ghcr.io/disconn3ct/docker-containers/code-server"
151
92
}
152
93
153
94
data "coder_parameter" "image_version" {
154
95
type = " string"
155
- name = " Linuxserver/Code-Server Docker Tag"
156
- description = " Docker tag for LinuxServer/Code-Server "
96
+ name = " Docker Image Tag"
97
+ description = " Docker image version "
157
98
mutable = true
158
- default = " latest "
99
+ default = " main "
159
100
}
160
101
161
102
provider "kubernetes" {
@@ -169,16 +110,11 @@ resource "coder_agent" "main" {
169
110
arch = " arm64"
170
111
dir = " /config/workspace"
171
112
# Runs as `abc` with the user's default shell
172
- startup_script = data. coder_parameter . dotfiles_uri . value != " " ? " /tmp/coder.?????? /coder dotfiles -y ${ data . coder_parameter . dotfiles_uri . value } " : null
113
+ startup_script = data. coder_parameter . dotfiles_uri . value != " " ? " $HOME/bin /coder dotfiles -y ${ data . coder_parameter . dotfiles_uri . value } " : null
173
114
174
115
env = {
175
116
" CODER_TELEMETRY" = " false"
176
- # So Terminal and SSH can use docker:
177
- " DOCKER_TLS_CERTDIR" = tobool (data. coder_parameter . enable_docker . value ) ? " /shared" : null
178
- " DOCKER_CONFIG" = tobool (data. coder_parameter . enable_docker . value ) ? " /shared/client/" : null
179
- " DOCKER_HOST" = tobool (data. coder_parameter . enable_docker . value ) ? " localhost:2376" : null
180
- " DOCKER_TLS" = tobool (data. coder_parameter . enable_docker . value ) ? " true" : null
181
- # And to align with the IDE:
117
+ # To align with the IDE:
182
118
" PATH" = " /config/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/config/go/bin:/config/.krew/bin:/config/.local/bin"
183
119
" GOPATH" = " /config/go"
184
120
}
@@ -191,43 +127,27 @@ resource "coder_agent" "main" {
191
127
metadata {
192
128
display_name = " CPU Usage"
193
129
key = " 0_cpu_usage"
194
- script = " /tmp/coder.?????? /coder stat cpu"
130
+ script = " $HOME/bin /coder stat cpu"
195
131
interval = 10
196
132
timeout = 1
197
133
}
198
134
199
135
metadata {
200
136
display_name = " RAM Usage"
201
137
key = " 1_ram_usage"
202
- script = " /tmp/coder.?????? /coder stat mem"
138
+ script = " $HOME/bin /coder stat mem"
203
139
interval = 10
204
140
timeout = 1
205
141
}
206
142
207
143
metadata {
208
144
display_name = " Home Disk"
209
145
key = " 3_home_disk"
210
- script = " /tmp/coder.?????? /coder stat disk --path $HOME"
146
+ script = " $HOME/bin /coder stat disk --path $HOME"
211
147
interval = 60
212
148
timeout = 1
213
149
}
214
150
215
- metadata {
216
- display_name = " CPU Usage (Host)"
217
- key = " 4_cpu_usage_host"
218
- script = " /tmp/coder.??????/coder stat cpu --host"
219
- interval = 10
220
- timeout = 1
221
- }
222
-
223
- metadata {
224
- display_name = " Memory Usage (Host)"
225
- key = " 5_mem_usage_host"
226
- script = " /tmp/coder.??????/coder stat mem --host"
227
- interval = 10
228
- timeout = 1
229
- }
230
-
231
151
metadata {
232
152
display_name = " Load Average (Host)"
233
153
key = " 6_load_host"
@@ -251,6 +171,9 @@ resource "kubernetes_config_map" "coder-service" {
251
171
#!/usr/bin/with-contenv bash
252
172
export CODER_AGENT_TOKEN="${ coder_agent . main . token } "
253
173
export CODER_TELEMETRY="false"
174
+
175
+ export BINARY_DIR=$HOME/bin
176
+ mkdir -pv $BINARY_DIR && chown abc: $BINARY_DIR
254
177
s6-setuidgid abc /custom-services.d/.coder-install.sh
255
178
EOSVC
256
179
" .coder-install.sh" = coder_agent.main.init_script
@@ -269,25 +192,6 @@ resource "kubernetes_config_map" "coder-init" {
269
192
# Required for start-script to work. (Default upstream shell is /bin/false.)
270
193
[ -x "${ data . coder_parameter . user_shell . value } " ] && chsh -s "${ data . coder_parameter . user_shell . value } " abc
271
194
EOSHELL
272
-
273
- " docker-install.sh" = <<- EOINIT
274
- #!/bin/bash
275
- set -euo pipefail
276
- ${ tobool (data. coder_parameter . enable_docker . value ) ? " " : " # Docker disabled\n exit 0" }
277
-
278
- # Docker container will fail on first startup until the directory is created
279
- # This also force-creates a .dockerignore to prevent Docker uploading itself to itself
280
- ${ tobool (data. coder_parameter . persist_docker . value ) ? " mkdir -p $HOME/workspace/.docker-data || true; chown 1000:1000 $HOME/workspace/.docker-data; echo .docker-data > $HOME/workspace/.dockerignore" : " # empty" }
281
-
282
- # install docker client
283
- . /etc/os-release
284
- UBUNTU_ARCH="$(dpkg --print-architecture)"
285
- apt remove -y docker docker-engine docker.io containerd runc || true
286
- curl -fsSLo /tmp/docker-ce-cli.deb https://download.docker.com/linux/ubuntu/dists/$${UBUNTU_CODENAME}/pool/stable/$${UBUNTU_ARCH}/docker-ce-cli_${ data . coder_parameter . docker_version . value } ~ubuntu.$${VERSION_ID}~$${UBUNTU_CODENAME}_$${UBUNTU_ARCH}.deb
287
- curl -fsSLo /tmp/docker-compose-plugin.deb https://download.docker.com/linux/ubuntu/dists/$${UBUNTU_CODENAME}/pool/stable/$${UBUNTU_ARCH}/docker-compose-plugin_${ data . coder_parameter . docker_compose_version . value } ~ubuntu.$${VERSION_ID}~$${UBUNTU_CODENAME}_$${UBUNTU_ARCH}.deb
288
- dpkg -i /tmp/docker-ce-cli.deb /tmp/docker-compose-plugin.deb
289
- rm -f /tmp/docker-ce-cli.deb /tmp/docker-compose-plugin.deb
290
- EOINIT
291
195
}
292
196
immutable = true
293
197
}
@@ -366,13 +270,16 @@ resource "kubernetes_pod" "main" {
366
270
hostname = " ${ data . coder_workspace . me . owner } -${ data . coder_workspace . me . name } "
367
271
container {
368
272
name = " dev"
369
- image = " ghcr.io/linuxserver/code-server :${ data . coder_parameter . image_version . value } "
273
+ image = " ${ data . coder_parameter . image . value } :${ data . coder_parameter . image_version . value } "
370
274
image_pull_policy = " Always"
371
275
port {
372
276
name = " http"
373
277
container_port = 8443
374
278
}
375
- # UID/GID must align with dind-rootless. Hardcoded: https://github.com/docker-library/docker/blob/c13cbee1cfd9d7582f7b2e9f958cf24e39b64715/20.10/dind-rootless/Dockerfile
279
+ # TODO: Use sysbox or similar to run unprivileged
280
+ security_context {
281
+ privileged = true
282
+ }
376
283
env {
377
284
name = " PUID"
378
285
value = " 1000"
@@ -381,15 +288,14 @@ resource "kubernetes_pod" "main" {
381
288
name = " PGID"
382
289
value = " 1000"
383
290
}
384
- # These are LinuxServer addons, not related to enable-docker
291
+ # These are LinuxServer addons
385
292
env {
386
293
name = " DOCKER_MODS"
387
- value = " linuxserver/mods:universal-package-install"
294
+ value = tobool (data . coder_parameter . enable_docker . value ) ? " linuxserver/mods:universal-docker-in-docker|linuxserver/mods:universal-package-install| " : " linuxserver/mods:universal-package-install"
388
295
}
389
296
env {
390
297
name = " INSTALL_PACKAGES"
391
298
value = join (" |" , jsondecode (data. coder_parameter . extra_package_list . value ))
392
- # tostring(data.coder_parameter.extra_package_list.value)
393
299
}
394
300
env {
395
301
name = " CODER_TELEMETRY"
@@ -411,7 +317,7 @@ resource "kubernetes_pod" "main" {
411
317
# copied from a cheat in start-script
412
318
# env {
413
319
# name = "GIT_SSH_COMMAND"
414
- # value = "/tmp/coder.?????? /coder gitssh --"
320
+ # value = "$HOME/bin /coder gitssh --"
415
321
# }
416
322
env {
417
323
name = " SSH_CONNECTION"
@@ -435,33 +341,6 @@ resource "kubernetes_pod" "main" {
435
341
value = " /config/go"
436
342
}
437
343
438
- # To connect to dind:
439
- dynamic "env" {
440
- # If docker is enabled, add these envs:
441
- for_each = tobool (data. coder_parameter . enable_docker . value ) ? [
442
- {
443
- name = " DOCKER_TLS_CERTDIR"
444
- value = " /shared"
445
- },
446
- {
447
- name = " DOCKER_CONFIG"
448
- value = " /shared/client/"
449
- },
450
- {
451
- name = " DOCKER_HOST"
452
- value = " localhost:2376"
453
- },
454
- {
455
- name = " DOCKER_TLS"
456
- value = " true"
457
- }
458
- ] : []
459
- content {
460
- name = env. value [" name" ]
461
- value = env. value [" value" ]
462
- }
463
- }
464
-
465
344
resources {
466
345
requests = {
467
346
cpu = " 10m"
@@ -478,99 +357,28 @@ resource "kubernetes_pod" "main" {
478
357
name = " home"
479
358
read_only = false
480
359
}
481
- dynamic "volume_mount" {
482
- for_each = tobool (data. coder_parameter . enable_docker . value ) ? [1 ] : []
483
- content {
484
- mount_path = " /shared"
485
- name = " docker-tls"
486
- read_only = false
487
- }
488
- }
360
+
489
361
volume_mount {
490
362
mount_path = " /custom-services.d"
491
363
name = " coder-service"
492
364
read_only = true
493
365
}
366
+
494
367
volume_mount {
495
368
mount_path = " /custom-cont-init.d"
496
369
name = " coder-init"
497
370
read_only = true
498
371
}
499
372
}
500
373
501
- dynamic "container" {
502
- for_each = data. coder_parameter . enable_docker . value ? [1 ] : []
503
-
504
- content {
505
- name = " docker"
506
- image = " docker:dind-rootless"
507
- env {
508
- name = " DOCKER_TLS_CERTDIR"
509
- value = " /shared"
510
- }
511
- # TODO: Use sysbox or similar to run unprivileged
512
- security_context {
513
- privileged = true
514
- }
515
-
516
- resources {
517
- requests = {
518
- cpu = " 10m"
519
- memory = " 100Mi"
520
- }
521
- limits = {
522
- cpu = " 1000m"
523
- memory = " 1Gi"
524
- }
525
- }
526
-
527
- # Generated certificates
528
- volume_mount {
529
- mount_path = " /shared"
530
- name = " docker-tls"
531
- read_only = false
532
- }
533
-
534
- dynamic "volume_mount" {
535
- # This is odd but basically amounts to "if persist-docker, then insert the volume-mount"
536
- for_each = data. coder_parameter . persist_docker . value ? [1 ] : []
537
- content {
538
- mount_path = " /home/rootless/"
539
- name = " home"
540
- sub_path = " workspace/.docker-data"
541
- read_only = false
542
- }
543
- }
544
- }
545
- }
546
374
volume {
547
375
name = " home"
548
376
persistent_volume_claim {
549
377
claim_name = kubernetes_persistent_volume_claim. home . metadata . 0 . name
550
378
read_only = false
551
379
}
552
380
}
553
- dynamic "volume" {
554
- for_each = data. coder_parameter . enable_docker . value ? [1 ] : []
555
- content {
556
- name = " docker-tls"
557
- empty_dir {
558
- medium = " Memory"
559
- size_limit = " 100M"
560
- }
561
- }
562
- }
563
- dynamic "volume" {
564
- # dind storage (image cache etc)
565
- # if enable-docker and NOT persist-docker, then insert the volume
566
- for_each = tobool (data. coder_parameter . enable_docker . value ) ? (tobool (data. coder_parameter . persist_docker . value ) ? [] : [1 ]) : []
567
- content {
568
- name = " docker"
569
- empty_dir {
570
- size_limit = " 16Gi"
571
- }
572
- }
573
- }
381
+
574
382
# Coder agent service
575
383
volume {
576
384
name = " coder-service"
0 commit comments