oc-deploy/docker/build_containers.sh

130 lines
3.1 KiB
Bash
Executable File

#!/bin/bash
# List of services to build
MINIMUM_REPOS=(
"oc-auth"
"oc-catalog"
"oc-datacenter"
"oc-peer"
"oc-scheduler"
"oc-schedulerd"
"oc-workflow"
"oc-workspace"
)
EXTRA_REPOS=(
"oc-front"
"oc-shared"
"oc-monitord"
)
REPOS=("${MINIMUM_REPOS[@]}") # Start with minimum repos
OC_ROOT="$(realpath ../..)"
DOCKER_BUILD="$(pwd)"
LOG_DIR="$DOCKER_BUILD/build_logs"
mkdir -p "$LOG_DIR"
cd "$OC_ROOT" || exit 1
# Function to build a service
build_service() {
local service=$1
local logfile="$LOG_DIR/$service.log"
echo "[START] Building $service..."
docker build -t "$service" "$OC_ROOT/$service" > "$logfile" 2>&1 &
echo $! # Return PID
}
# Track running builds
declare -A pids
declare -a active_services=()
# Select services to build
echo "🔧 Optional extra services:"
for i in "${!EXTRA_REPOS[@]}"; do
echo " [$((i+1))] ${EXTRA_REPOS[$i]}"
done
read -p "🟡 Do you want to add any extra services? Enter numbers separated by space (e.g., 1 3), or press Enter to skip: " -a selected
for index in "${selected[@]}"; do
if [[ "$index" =~ ^[0-9]+$ ]] && (( index >= 1 && index <= ${#EXTRA_REPOS[@]} )); then
REPOS+=("${EXTRA_REPOS[$((index-1))]}")
else
echo "⚠️ Invalid selection: $index"
fi
done
echo "✅ Selected services:"
for repo in "${REPOS[@]}"; do
echo " - $repo"
done
# Launch builds
for service in "${REPOS[@]}"; do
IMAGE_NAME="$service"
# Check if the image exists locally
if docker image inspect "$IMAGE_NAME" >/dev/null 2>&1; then
read -p "🟡 Image '$IMAGE_NAME' already exists. Rebuild? (y/N): " rebuild
if [[ "$rebuild" =~ ^[Yy]$ ]]; then
echo "🔄 Rebuilding image for '$IMAGE_NAME'..."
else
echo "⏭️ Skipping build for '$IMAGE_NAME'."
continue
fi
fi
# Check if a container is already running from this image
if docker ps --filter "ancestor=$IMAGE_NAME" --format '{{.ID}}' | grep -q .; then
echo "✅ A container from image '$IMAGE_NAME' is already running. Skipping build."
else
SERVICE_PATH="$OC_ROOT/$service"
if [ -d "$SERVICE_PATH" ]; then
build_service "$service" &
pids["$service"]=$!
active_services+=("$service")
else
echo "⚠️ Directory not found for $service. Skipping."
fi
fi
done
echo "========================"
echo "Building: ${active_services[*]}"
echo "========================"
# Monitor logs for each build in parallel
for service in "${active_services[@]}"; do
logfile="$LOG_DIR/$service.log"
(
tail -n 0 -f "$logfile" | while IFS= read -r line; do
# Highlight docker build steps
if [[ "$line" =~ Step\ ([0-9]+/[0-9]+) ]]; then
echo -e "[$service] 🚧 ${BASH_REMATCH[0]}: $line"
else
echo "[$service] $line"
fi
done
) &
done
# Wait for all builds to complete
for pid in "${pids[@]}"; do
wait "$pid"
done
for service in "${active_services[@]}"; do
cd $OC_ROOT/service
docker compose up -d
done
echo "✅ All builds completed."