Инструменты разработки можно устанавливать скриптами шаблона на постоянный том рабочего пространства. Агент и IDE используют этот том совместно. Установка в /workspace/state сохраняется после остановки и запуска, а файлы проекта остаются в /workspace/code.
Штатные контейнеры работают с UID/GID 10000 и корневой файловой системой только для чтения. Выбирайте дистрибутив инструмента, который можно распаковать в пользовательскую директорию без sudo, apt или apk.
Установка Go
Пример устанавливает Go 1.27.3 на Linux amd64 или arm64. Версия и SHA-256 архивов зафиксированы в скрипте; они опубликованы на странице загрузок Go.
Скрипт установки
Добавьте в черновик шаблона файл scripts/start.sh со следующим содержимым. Если файл уже содержит команды настройки, объедините их с примером:
#!/usr/bin/env bash
set -euo pipefail
: "${DDP_STATE_DIR:?}"
go_version="1.27.3"
case "$(uname -m)" in
x86_64)
go_arch="amd64"
go_checksum="65efbc80fdc1fa2cd2631cad5b481777a68e8725f34e89f50fc6ac714e379b40"
;;
aarch64|arm64)
go_arch="arm64"
go_checksum="a06e99309dbcbdca1a8ccd2282c3ee146e55930886e26b4f1193269587165f49"
;;
*)
printf 'Unsupported architecture: %s\n' "$(uname -m)" >&2
exit 1
;;
esac
toolchains_dir="${DDP_STATE_DIR}/toolchains"
go_directory="${toolchains_dir}/go${go_version}-linux-${go_arch}"
mkdir -p "$toolchains_dir" "${DDP_STATE_DIR}/tools" "${DDP_STATE_DIR}/tmp/go"
if [ ! -d "$go_directory" ]; then
staging_dir="$(mktemp -d "${toolchains_dir}/.go-install.XXXXXX")"
trap 'rm -rf "$staging_dir"' EXIT
curl -fsSL --retry 3 --connect-timeout 15 --max-time 300 "https://go.dev/dl/go${go_version}.linux-${go_arch}.tar.gz" -o "${staging_dir}/go.tar.gz"
printf '%s go.tar.gz\n' "$go_checksum" > "${staging_dir}/go.sha256"
(cd "$staging_dir" && sha256sum -c go.sha256)
tar -xzf "${staging_dir}/go.tar.gz" -C "$staging_dir"
mv "${staging_dir}/go" "$go_directory"
rm -rf "$staging_dir"
trap - EXIT
fi
ln -sfn "$go_directory" "${DDP_STATE_DIR}/tools/go"
"${DDP_STATE_DIR}/tools/go/bin/go" versionСкрипт скачивает и проверяет архив только при отсутствии выбранной версии на томе. Распаковка выполняется во временной директории на том же томе; готовая установка переносится в директорию версии. При повторном запуске используется сохранённая копия.
Ссылка /workspace/state/tools/go указывает на выбранную версию. Благодаря этому при обновлении версии путь в PATH остаётся прежним.
Используйте start.sh, чтобы пример применялся и к новым, и к уже созданным пространствам после обновления шаблона. create.sh пропускается, если первоначальная настройка тома уже успешно выполнялась.
Окружение агента и IDE
В main.tf добавьте следующие поля в существующий блок local.environment, сохранив остальные поля:
PATH = "${local.state_directory}/tools/go/bin:${local.state_directory}/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
GOPATH = "${local.state_directory}/go"
GOCACHE = "${local.state_directory}/cache/go-build"
GOTMPDIR = "${local.state_directory}/tmp/go"
CGO_ENABLED = "0"Штатный шаблон передаёт local.environment контейнеру первоначальной настройки, агенту и IDE. Go и команды, установленные через go install, будут доступны во всех этих контейнерах. Кеш сборки и GOPATH, включая кеш модулей, располагаются на постоянном томе. GOTMPDIR переносит временные файлы компиляции на тот же том, чтобы сборка не занимала ограниченный /tmp контейнера.
Изменение PATH через export внутри start.sh действует только на сам скрипт и его дочерние процессы. Поэтому задавайте переменные в main.tf.
В примере CGO_ENABLED = "0" отключает использование C-компилятора. Он подходит для проектов на Go без зависимостей от C; для проектов с CGo также требуются соответствующий компилятор и системные библиотеки.
Публикация и проверка
Для запуска примера поду нужен HTTPS-доступ к go.dev и адресу загрузки после перенаправления, обычно dl.google.com. Для зависимостей проекта также нужен доступ к выбранному прокси Go-модулей или репозиториям. Если прямой доступ закрыт, разместите тот же архив во внутреннем хранилище и измените URL в скрипте, сохранив проверку SHA-256.
Чтобы применить пример:
Сохраните
scripts/start.shиmain.tf, опубликуйте версию и активируйте её.Создайте новое рабочее пространство либо остановите существующее, обновите его версию шаблона и снова запустите.
В логе контейнера
bootstrapна вкладке «Диагностика» проверьте успешную проверку архива и строкуgo version.Откройте терминал IDE и проверьте установку:
go version go env GOPATH GOCACHE GOTMPDIR CGO_ENABLED command -v goПопросите агента в чате выполнить
go version. Он должен увидеть ту же версию, что и терминал IDE.Остановите и запустите пространство ещё раз. Go должен остаться доступным; повторное скачивание той же версии не требуется.
Проверка сборки
Для проверки компилятора создайте и запустите программу вне директории проекта. Пример не меняет go.mod и исходные файлы проекта:
mkdir -p /workspace/state/checks/go
cat > /workspace/state/checks/go/hello.go <<'EOF'
package main
import "fmt"
func main() {
fmt.Println("Go is ready")
}
EOF
go run /workspace/state/checks/go/hello.goОжидаемый вывод — Go is ready. Затем выполните проверки самого проекта, например go test ./... из его корневой директории.
Обновление версии инструмента
Для обновления Go измените go_version и обе контрольные суммы архивов в scripts/start.sh. Возьмите значения со страницы загрузок Go, сохраните и опубликуйте новую версию шаблона.
Остановите пространство, обновите шаблон и снова запустите. Скрипт установит новую версию в отдельную директорию и переключит ссылку tools/go. Прежняя версия останется на томе; её директорию можно удалить из терминала после проверки новой версии.
Установка других инструментов
Для других инструментов используйте ту же последовательность: выберите архив под архитектуру и системные библиотеки контейнера, проверьте его контрольную сумму, распакуйте на постоянный том и добавьте исполняемые файлы в окружение шаблона.
Совместимость проверяйте отдельно в агенте и IDE. Штатный агент использует Alpine Linux с musl; для него подходят совместимые с musl или статически скомпонованные бинарные файлы. Совпадения архитектуры процессора недостаточно, если инструмент зависит от системных библиотек.