Skip to content

Commit ce09428

Browse files
authored
feat: use dockermod instead
update from origin
1 parent dc95851 commit ce09428

File tree

1 file changed

+32
-224
lines changed

1 file changed

+32
-224
lines changed

codeserver-ls-docker/main.tf

Lines changed: 32 additions & 224 deletions
Original file line numberDiff line numberDiff line change
@@ -43,52 +43,6 @@ data "coder_parameter" "enable_docker" {
4343
default = true
4444
}
4545

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-
9246
data "coder_parameter" "user_shell" {
9347
name = "User Shell"
9448
description = <<-EOF
@@ -110,7 +64,7 @@ data "coder_parameter" "dotfiles_uri" {
11064
11165
This will be applied on every workstation start, and may overwrite existing
11266
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.
11468
EOF
11569
default = ""
11670
}
@@ -122,40 +76,27 @@ data "coder_parameter" "extra_package_list" {
12276
description = <<-EOF
12377
A list of Ubuntu packages to install.
12478
125-
Docker and docker-compose packages will be removed and replaced with upstream
126-
packages.
127-
12879
These packages are installed during every workspace startup and may cause delays
12980
before the workspace is available.
13081
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.
13382
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"
15192
}
15293

15394
data "coder_parameter" "image_version" {
15495
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"
15798
mutable = true
158-
default = "latest"
99+
default = "main"
159100
}
160101

161102
provider "kubernetes" {
@@ -169,16 +110,11 @@ resource "coder_agent" "main" {
169110
arch = "arm64"
170111
dir = "/config/workspace"
171112
# 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
173114

174115
env = {
175116
"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:
182118
"PATH" = "/config/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/config/go/bin:/config/.krew/bin:/config/.local/bin"
183119
"GOPATH" = "/config/go"
184120
}
@@ -191,43 +127,27 @@ resource "coder_agent" "main" {
191127
metadata {
192128
display_name = "CPU Usage"
193129
key = "0_cpu_usage"
194-
script = "/tmp/coder.??????/coder stat cpu"
130+
script = "$HOME/bin/coder stat cpu"
195131
interval = 10
196132
timeout = 1
197133
}
198134

199135
metadata {
200136
display_name = "RAM Usage"
201137
key = "1_ram_usage"
202-
script = "/tmp/coder.??????/coder stat mem"
138+
script = "$HOME/bin/coder stat mem"
203139
interval = 10
204140
timeout = 1
205141
}
206142

207143
metadata {
208144
display_name = "Home Disk"
209145
key = "3_home_disk"
210-
script = "/tmp/coder.??????/coder stat disk --path $HOME"
146+
script = "$HOME/bin/coder stat disk --path $HOME"
211147
interval = 60
212148
timeout = 1
213149
}
214150

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-
231151
metadata {
232152
display_name = "Load Average (Host)"
233153
key = "6_load_host"
@@ -251,6 +171,9 @@ resource "kubernetes_config_map" "coder-service" {
251171
#!/usr/bin/with-contenv bash
252172
export CODER_AGENT_TOKEN="${coder_agent.main.token}"
253173
export CODER_TELEMETRY="false"
174+
175+
export BINARY_DIR=$HOME/bin
176+
mkdir -pv $BINARY_DIR && chown abc: $BINARY_DIR
254177
s6-setuidgid abc /custom-services.d/.coder-install.sh
255178
EOSVC
256179
".coder-install.sh" = coder_agent.main.init_script
@@ -269,25 +192,6 @@ resource "kubernetes_config_map" "coder-init" {
269192
# Required for start-script to work. (Default upstream shell is /bin/false.)
270193
[ -x "${data.coder_parameter.user_shell.value}" ] && chsh -s "${data.coder_parameter.user_shell.value}" abc
271194
EOSHELL
272-
273-
"docker-install.sh" = <<-EOINIT
274-
#!/bin/bash
275-
set -euo pipefail
276-
${tobool(data.coder_parameter.enable_docker.value) ? "" : "# Docker disabled\nexit 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
291195
}
292196
immutable = true
293197
}
@@ -366,13 +270,16 @@ resource "kubernetes_pod" "main" {
366270
hostname = "${data.coder_workspace.me.owner}-${data.coder_workspace.me.name}"
367271
container {
368272
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}"
370274
image_pull_policy = "Always"
371275
port {
372276
name = "http"
373277
container_port = 8443
374278
}
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+
}
376283
env {
377284
name = "PUID"
378285
value = "1000"
@@ -381,15 +288,14 @@ resource "kubernetes_pod" "main" {
381288
name = "PGID"
382289
value = "1000"
383290
}
384-
# These are LinuxServer addons, not related to enable-docker
291+
# These are LinuxServer addons
385292
env {
386293
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"
388295
}
389296
env {
390297
name = "INSTALL_PACKAGES"
391298
value = join("|", jsondecode(data.coder_parameter.extra_package_list.value))
392-
# tostring(data.coder_parameter.extra_package_list.value)
393299
}
394300
env {
395301
name = "CODER_TELEMETRY"
@@ -411,7 +317,7 @@ resource "kubernetes_pod" "main" {
411317
# copied from a cheat in start-script
412318
#env {
413319
# name = "GIT_SSH_COMMAND"
414-
# value = "/tmp/coder.??????/coder gitssh --"
320+
# value = "$HOME/bin/coder gitssh --"
415321
#}
416322
env {
417323
name = "SSH_CONNECTION"
@@ -435,33 +341,6 @@ resource "kubernetes_pod" "main" {
435341
value = "/config/go"
436342
}
437343

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-
465344
resources {
466345
requests = {
467346
cpu = "10m"
@@ -478,99 +357,28 @@ resource "kubernetes_pod" "main" {
478357
name = "home"
479358
read_only = false
480359
}
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+
489361
volume_mount {
490362
mount_path = "/custom-services.d"
491363
name = "coder-service"
492364
read_only = true
493365
}
366+
494367
volume_mount {
495368
mount_path = "/custom-cont-init.d"
496369
name = "coder-init"
497370
read_only = true
498371
}
499372
}
500373

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-
}
546374
volume {
547375
name = "home"
548376
persistent_volume_claim {
549377
claim_name = kubernetes_persistent_volume_claim.home.metadata.0.name
550378
read_only = false
551379
}
552380
}
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+
574382
# Coder agent service
575383
volume {
576384
name = "coder-service"

0 commit comments

Comments
 (0)