-
Notifications
You must be signed in to change notification settings - Fork 24
Open
Description
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
Metadata
Metadata
Assignees
Labels
No labels