# Note: this example demonstrates the use of # dotfiles with Coder templates. # The Docker aspect of the template only works # with macOS/Linux amd64 systems. See the full # Docker example for details terraform { required_providers { coder = { source = "coder/coder" version = "0.6.10" } docker = { source = "kreuzwerker/docker" version = "~> 2.20.2" } } } data "coder_provisioner" "me" { } provider "docker" { } data "coder_workspace" "me" { } variable "docker_image" { default = "codercom/enterprise-base:ubuntu" } variable "dotfiles_uri" { description = <<-EOF Dotfiles repo URI (optional) see https://dotfiles.github.io EOF default = "" } resource "coder_agent" "main" { arch = data.coder_provisioner.me.arch os = "linux" login_before_ready = false startup_script_timeout = 180 env = { "DOTFILES_URI" = var.dotfiles_uri != "" ? var.dotfiles_uri : null } startup_script = <<-EOT set -e if [ -n "$DOTFILES_URI" ]; then echo "Installing dotfiles from $DOTFILES_URI" coder dotfiles -y "$DOTFILES_URI" fi EOT } resource "docker_volume" "home_volume" { name = "coder-${data.coder_workspace.me.id}-home" # Protect the volume from being deleted due to changes in attributes. lifecycle { ignore_changes = all } # Add labels in Docker to keep track of orphan resources. labels { label = "coder.owner" value = data.coder_workspace.me.owner } labels { label = "coder.owner_id" value = data.coder_workspace.me.owner_id } labels { label = "coder.workspace_id" value = data.coder_workspace.me.id } # This field becomes outdated if the workspace is renamed but can # be useful for debugging or cleaning out dangling volumes. labels { label = "coder.workspace_name_at_creation" value = data.coder_workspace.me.name } } resource "docker_container" "workspace" { count = data.coder_workspace.me.start_count image = var.docker_image # Uses lower() to avoid Docker restriction on container names. name = "coder-${data.coder_workspace.me.owner}-${lower(data.coder_workspace.me.name)}" # Hostname makes the shell more user friendly: coder@my-workspace:~$ hostname = data.coder_workspace.me.name # Use the docker gateway if the access URL is 127.0.0.1 entrypoint = ["sh", "-c", replace(coder_agent.main.init_script, "/localhost|127\\.0\\.0\\.1/", "host.docker.internal")] env = ["CODER_AGENT_TOKEN=${coder_agent.main.token}"] host { host = "host.docker.internal" ip = "host-gateway" } volumes { container_path = "/home/coder/" volume_name = docker_volume.home_volume.name read_only = false } # Add labels in Docker to keep track of orphan resources. labels { label = "coder.owner" value = data.coder_workspace.me.owner } labels { label = "coder.owner_id" value = data.coder_workspace.me.owner_id } labels { label = "coder.workspace_id" value = data.coder_workspace.me.id } labels { label = "coder.workspace_name" value = data.coder_workspace.me.name } } resource "coder_metadata" "container_info" { count = data.coder_workspace.me.start_count resource_id = docker_container.workspace[0].id item { key = "image" value = var.docker_image } }