#!/usr/bin/env bash # commands/build.command.sh # # Builds the Docker image and compose stack for a given environment. # # Usage: # dx build [flags] # # Flags: # --dev / --qly / --prd Target environment (default: dev) # --project=NAME Override project name # --port=PORT Override app port (e.g. 8082, auto:8080) # --db=TYPE Override DB engine (mysql | mssql) # --db-port=PORT Override DB port # --sync-hosts Sync domain to /etc/hosts (requires root) # --no-vhosts Skip Apache vhost generation # --no-interact Non-interactive mode # --debug Enable shell trace (set -x) # ============================================ # Lifecycle # ============================================ function cmd::build::on_load() { load_module template load_module apache flag::register \ --sync-hosts \ --no-vhosts \ --no-interact \ --scaffold \ --framework \ --debug } # ============================================ # Public entrypoint # ============================================ function cmd::build::run() { local flags=() for arg in "$@"; do flags+=("$arg") done if ! flag::parse "${flags[@]+"${flags[@]}"}"; then cmd::build::help return 1 fi # CLI overrides — applied after env files so flags win [[ -n "${PROJECT_NAME_OVERRIDE:-}" ]] && export PROJECT_NAME="$PROJECT_NAME_OVERRIDE" [[ -n "${APP_PORT_OVERRIDE:-}" ]] && export APP_PORT="$APP_PORT_OVERRIDE" [[ -n "${DB_ENGINE_OVERRIDE:-}" ]] && export DB_ENGINE="$DB_ENGINE_OVERRIDE" [[ -n "${DB_PORT_OVERRIDE:-}" ]] && export DB_PORT="$DB_PORT_OVERRIDE" # ============================================ # Project scaffolding # ============================================ if ! app::exists || flag::enabled --scaffold; then app::scaffold "$(ctx::root)" fi # ============================================ # Runtime artifacts # ============================================ artifact::init # ============================================ # Network & Virtual Hosts # ============================================ network::ports::prepare if flag::enabled --sync-hosts && ! flag::enabled --no-interact; then load_command hosts hosts::sync fi if ! flag::enabled --no-vhosts; then apache::generate_vhosts fi # ============================================ # Docker image # ============================================ runtime::run_if BUILD_IMAGE docker::image::generate || { log::error "Failed to generate Docker image (${APP_IMAGE}:${ENVIRONMENT})" return 1 } runtime::run_if BUILD_IMAGE docker::image::build || { log::error "Failed to build Docker image (${APP_IMAGE}:${ENVIRONMENT})" return 1 } # ============================================ # Docker compose stack # ============================================ runtime::run_if BUILD_STACK docker::compose::generate || { log::error "Failed to generate compose stack (${ENVIRONMENT})" return 1 } runtime::run_if BUILD_STACK docker::compose::build || { log::error "Failed to build compose stack (${ENVIRONMENT})" return 1 } # ============================================ # Done # ============================================ cmd::build::_show_networking log::success "Build complete!" flag::scaffold_defaults_file cmd::build::_hint_next_steps } # ============================================ # Help # ============================================ function cmd::build::help() { cat <