terraform-provider-coder icon indicating copy to clipboard operation
terraform-provider-coder copied to clipboard

can't create mutils agent

Open xrain0610 opened this issue 1 month ago • 0 comments

resource "coder_agent" "agents" { for_each = local.containers_set arch = data.coder_provisioner.me.arch os = "linux" startup_script = <<-EOT

I want to create a workspace , it contain mutils docker container, I want ever container can use webide, how show I Do?

there is full template

terraform {
  required_providers {
    coder = {
      source = "coder/coder"
    }
    docker = {
      source = "kreuzwerker/docker"
    }
  }
}

locals {
  username        = data.coder_workspace_owner.me.name
  workspace_name  = data.coder_workspace.me.name
  containers_list = jsondecode(data.coder_parameter.spaces.value)
  containers_set = toset(local.containers_list)
  proxy_server    = "http://192.168.0.250:8118"
}

variable "docker_socket" {
  default     = ""
  description = "(Optional) Docker socket URI"
  type        = string
}

provider "docker" {
  host = var.docker_socket != "" ? var.docker_socket : null
}

data "coder_provisioner" "me" {}
data "coder_workspace" "me" {}
data "coder_workspace_owner" "me" {}

data "coder_parameter" "spaces" {
  name        = "工作容器列表"
  description = "每一个名称都会创建一个容器在当前space下"
  mutable     = true
  type        = "list(string)"
  default = jsonencode(["api","app"])
}

data "coder_parameter" "ssh_key" {
  name        = "SSH Private Key"
  description = "SSH Private Key For Git And SSH, 不要包含-----BEGIN OPENSSH PRIVATE KEY-----和-----END OPENSSH PRIVATE KEY-----"
  default     = ""
  mutable     = true
  type        = "string"
}

resource "null_resource" "create_host_dirs" {
  for_each = local.containers_set
  provisioner "local-exec" {
    command = <<-EOT
      host_dir='/data/${local.username}/${local.workspace_name}/${each.value}'
      host_dir_in_coder="/host$host_dir"
      mkdir -p $host_dir_in_coder
      chmod -R 777 $host_dir_in_coder
      echo "Host directory "$host_dir" created"
    EOT
  }
}

resource "docker_volume" "project_volumes" {
  for_each = local.containers_set
  name = "coder-${local.username}-${local.workspace_name}-${each.value}-projects"
  driver_opts = {
    type   = "none"
    device = "/data/${local.username}/${local.workspace_name}/${each.value}"
    o      = "bind"
  }
  
  depends_on = [null_resource.create_host_dirs]

  lifecycle {
    ignore_changes = all
  }

  labels {
    label = "coder.owner"
    value = local.username
  }
  labels {
    label = "coder.workspace_id"
    value = data.coder_workspace.me.id
  }
  labels {
    label = "coder.container_name"
    value = each.value
  }
}

resource "coder_agent" "agents" {
  for_each = local.containers_set
  arch           = data.coder_provisioner.me.arch
  os             = "linux"
  startup_script = <<-EOT
    set -e
    cp -rT /etc/skel ~
    mkdir -p ~/.ssh
    echo "-----BEGIN OPENSSH PRIVATE KEY-----" > ~/.ssh/id_rsa
    echo "${data.coder_parameter.ssh_key.value}" | tr ' ' '\n' >> ~/.ssh/id_rsa
    echo "-----END OPENSSH PRIVATE KEY-----" >> ~/.ssh/id_rsa
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/id_rsa
  EOT

  env = {
    GIT_AUTHOR_NAME     = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
    GIT_AUTHOR_EMAIL    = "${data.coder_workspace_owner.me.email}"
    GIT_COMMITTER_NAME  = coalesce(data.coder_workspace_owner.me.full_name, data.coder_workspace_owner.me.name)
    GIT_COMMITTER_EMAIL = "${data.coder_workspace_owner.me.email}"
    # CONTAINER_NAME      = local.containers_list[count.index]  # 直接引用列表值
  }
}
module "code-server" {
  for_each = local.containers_set
  
  source         = "registry.coder.com/coder/code-server/coder"
  version        = "~> 1.0"
  folder         = "/projects"
  slug           = "code-server-${each.value}"
  offline        = true
  install_prefix = "/usr"
  agent_id       = coder_agent.agents[each.value].id
}
resource "docker_container" "containers" {
  for_each = local.containers_set
  image = "xrain0610/debian:coder"
  name  = "coder-${local.username}-${local.workspace_name}-${each.value}"
  hostname = "${local.workspace_name}-${each.value}"
  entrypoint = ["sh", "-c", replace(coder_agent.agents[each.value].init_script, "/localhost|127\\.0\\.0\\.1/", "host.docker.internal")]
  env        = ["CODER_AGENT_TOKEN=${coder_agent.agents[each.key]}"]

  volumes {
    container_path = "/projects"
    volume_name    = docker_volume.project_volumes[each.value].name
    read_only      = false
  }
  labels {
    label = "coder.owner"
    value = local.username
  }
  labels {
    label = "coder.owner_id"
    value = data.coder_workspace_owner.me.id
  }
  labels {
    label = "coder.workspace_id"
    value = data.coder_workspace.me.id
  }
  labels {
    label = "coder.workspace_name"
    value = local.workspace_name
  }
  labels {
    label = "coder.container_name"
    value = each.value
  }
}
` ``

then build error occured,

Error during the build
template import provision for start: plan resources: duplicate agent name: agents
scope
organization

xrain0610 avatar Nov 14 '25 20:11 xrain0610