provisioning/schemas/platform/templates/docker/docker-compose.build.yml.ncl

127 lines
4 KiB
Text

# Docker Compose Build Configuration
# Generates docker-compose file optimized for building all services with BuildKit caching
# Usage: nickel export --format yaml docker-compose.build.yml.ncl > docker-compose.build.yml
#
# Pattern:
# - Imports all service defaults to extract build configs
# - Generates build-only services (no runtime config)
# - Supports BuildKit cache modes: registry, local, inline
# - Enables parallel builds with --parallel flag
#
# Generated file usage:
# docker compose -f docker-compose.build.yml build --parallel
# docker compose -f docker-compose.build.yml build orchestrator
# Import all service defaults
let orchestrator_defaults = import "../../defaults/orchestrator-defaults.ncl" in
let control_center_defaults = import "../../defaults/control-center-defaults.ncl" in
let extension_registry_defaults = import "../../defaults/extension-registry-defaults.ncl" in
let mcp_server_defaults = import "../../defaults/mcp-server-defaults.ncl" in
let daemon_defaults = import "../../defaults/provisioning-daemon-defaults.ncl" in
let ai_service_defaults = import "../../defaults/ai-service-defaults.ncl" in
let rag_defaults = import "../../defaults/rag-defaults.ncl" in
let vault_defaults = import "../../defaults/vault-service-defaults.ncl" in
# Helper function to generate cache configuration based on mode
let cache_config = fun build_cfg registry =>
let mode = build_cfg.buildkit.cache_mode in
if mode == 'registry then
{
cache_from = [
"type=registry,ref=" ++ registry ++ "/" ++ build_cfg.package ++ ":buildcache"
],
cache_to = [
"type=registry,ref=" ++ registry ++ "/" ++ build_cfg.package ++ ":buildcache,mode=max"
],
}
else if mode == 'local then
{
cache_from = [
"type=local,src=/tmp/docker-cache/" ++ build_cfg.package
],
cache_to = [
"type=local,dest=/tmp/docker-cache/" ++ build_cfg.package ++ ",mode=max"
],
}
else # inline
{
cache_from = [],
cache_to = [
"type=inline"
],
}
in
# Helper function to generate build args
let build_args = fun build_cfg => {
CARGO_BUILD_JOBS = std.string.from_number build_cfg.buildkit.parallel_jobs,
RUST_LOG = "info",
} in
# Helper function to generate service build config
let service_build = fun name dockerfile_path build_cfg registry => {
build = {
context = "../../platform",
dockerfile = dockerfile_path,
args = build_args build_cfg,
} & (cache_config build_cfg registry),
image = registry ++ "/" ++ build_cfg.package ++ ":latest",
} in
# Default registry (override by modifying this value or using nickel CLI --override)
# Example: nickel export --override registry='"myregistry.io"' --format yaml docker-compose.build.yml.ncl
let registry = "localhost:5000" in
{
version = "3.8",
services = {
orchestrator = service_build
"orchestrator"
"crates/orchestrator/Dockerfile"
orchestrator_defaults.orchestrator.build
registry,
control-center = service_build
"control-center"
"crates/control-center/Dockerfile"
control_center_defaults.control_center.build
registry,
extension-registry = service_build
"extension-registry"
"crates/extension-registry/Dockerfile"
extension_registry_defaults.extension_registry.build
registry,
mcp-server = service_build
"mcp-server"
"crates/mcp-server/Dockerfile"
mcp_server_defaults.mcp_server.build
registry,
provisioning-daemon = service_build
"provisioning-daemon"
"crates/daemon/Dockerfile"
daemon_defaults.provisioning_daemon.build
registry,
ai-service = service_build
"ai-service"
"crates/ai-service/Dockerfile"
ai_service_defaults.ai_service.build
registry,
rag = service_build
"rag"
"crates/rag/Dockerfile"
rag_defaults.rag.build
registry,
vault-service = service_build
"vault-service"
"crates/vault-service/Dockerfile"
vault_defaults.vault.build
registry,
},
}