# 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, }, }