diff --git a/desktop/src/renderer/public/icons/providers/colima.png b/desktop/src/renderer/public/icons/providers/colima.png new file mode 100644 index 000000000..c525e6817 Binary files /dev/null and b/desktop/src/renderer/public/icons/providers/colima.png differ diff --git a/desktop/src/renderer/src/lib/components/provider/ProviderIcon.svelte b/desktop/src/renderer/src/lib/components/provider/ProviderIcon.svelte index 25df74e61..bb3c1c33c 100644 --- a/desktop/src/renderer/src/lib/components/provider/ProviderIcon.svelte +++ b/desktop/src/renderer/src/lib/components/provider/ProviderIcon.svelte @@ -6,6 +6,7 @@ const ICON_MAP: Record = { docker: "./icons/providers/docker.svg", podman: "./icons/providers/podman.svg", apple: "./icons/providers/apple.svg", + colima: "./icons/providers/colima.png", aws: "./icons/providers/aws.svg", amazon: "./icons/providers/aws.svg", gcloud: "./icons/providers/gcp.svg", diff --git a/desktop/src/renderer/src/lib/components/provider/ProviderWizard.svelte b/desktop/src/renderer/src/lib/components/provider/ProviderWizard.svelte index 8567ad09e..e9dc52ab9 100644 --- a/desktop/src/renderer/src/lib/components/provider/ProviderWizard.svelte +++ b/desktop/src/renderer/src/lib/components/provider/ProviderWizard.svelte @@ -38,6 +38,7 @@ const PRESETS = [ { name: "docker", description: "Local Docker containers" }, { name: "podman", description: "Local Podman containers" }, { name: "apple", description: "Apple containers (macOS 26+, Apple silicon)" }, + { name: "colima", description: "Colima (Docker/containerd on macOS via Lima)" }, { name: "ssh", description: "Remote SSH machines" }, { name: "kubernetes", description: "Kubernetes clusters" }, { name: "aws", description: "Amazon Web Services" }, diff --git a/providers/colima/provider.yaml b/providers/colima/provider.yaml new file mode 100644 index 000000000..e693a7492 --- /dev/null +++ b/providers/colima/provider.yaml @@ -0,0 +1,44 @@ +name: colima +version: v1.0.0 +icon: https://dl.devsy.sh/assets/colima.png +home: https://github.com/devsy-org/devsy +description: |- + Devsy on Colima (Docker/containerd on macOS via Lima) +optionGroups: + - options: + - COLIMA_PATH + - COLIMA_PROFILE + - COLIMA_HOST + - COLIMA_ELEVATION + - INACTIVITY_TIMEOUT + name: "Advanced Options" +options: + INACTIVITY_TIMEOUT: + description: "If defined, will automatically stop the container after the inactivity period. Examples: 10m, 1h" + COLIMA_PATH: + description: The path where to find the docker binary Colima exposes. + default: docker + COLIMA_PROFILE: + description: The Colima profile (instance) to target. Corresponds to `colima start --profile`. + default: default + COLIMA_HOST: + global: true + description: The Colima Docker socket to connect to. Defaults to the socket for the selected profile. + command: |- + profile="${COLIMA_PROFILE:-default}" + echo "unix://${HOME}/.colima/${profile}/docker.sock" + COLIMA_ELEVATION: + description: "Optionally run docker commands through a privilege-elevation helper. One of: pkexec, sudo, doas, or none. Colima runs rootless by default; leave as none." + default: none +agent: + containerInactivityTimeout: ${INACTIVITY_TIMEOUT} + local: true + docker: + path: ${COLIMA_PATH} + elevation: ${COLIMA_ELEVATION} + install: false + env: + DOCKER_HOST: ${COLIMA_HOST} +exec: + command: |- + "${DEVSY}" internal sh -c "${COMMAND}" diff --git a/providers/providers.go b/providers/providers.go index d1dbe5a27..311a9f859 100644 --- a/providers/providers.go +++ b/providers/providers.go @@ -7,6 +7,9 @@ import ( //go:embed apple/provider.yaml var AppleProvider string +//go:embed colima/provider.yaml +var ColimaProvider string + //go:embed docker/provider.yaml var DockerProvider string @@ -23,6 +26,7 @@ var ProProvider string func GetBuiltInProviders() map[string]string { return map[string]string{ "apple": AppleProvider, + "colima": ColimaProvider, "docker": DockerProvider, "kubernetes": KubernetesProvider, "podman": PodmanProvider, diff --git a/providers/providers_test.go b/providers/providers_test.go index aef5993e7..4a02735f4 100644 --- a/providers/providers_test.go +++ b/providers/providers_test.go @@ -33,3 +33,16 @@ func TestAppleProviderUsesAppleDriver(t *testing.T) { t.Errorf("apple provider driver = %q, want %q", cfg.Agent.Driver, provider.AppleDriver) } } + +func TestColimaProviderUsesDockerDriver(t *testing.T) { + cfg, err := provider.ParseProvider(strings.NewReader(providers.ColimaProvider)) + if err != nil { + t.Fatalf("parse colima provider: %v", err) + } + if cfg.Agent.Driver != "" && cfg.Agent.Driver != provider.DockerDriver { + t.Errorf("colima provider driver = %q, want docker", cfg.Agent.Driver) + } + if _, ok := cfg.Agent.Docker.Env["DOCKER_HOST"]; !ok { + t.Errorf("colima provider missing DOCKER_HOST env for docker driver") + } +}