first commit
This commit is contained in:
Executable
+309
@@ -0,0 +1,309 @@
|
||||
#!/bin/bash
|
||||
|
||||
# TankStopp Docker Build Script
|
||||
# This script builds Docker images for the TankStopp application
|
||||
|
||||
set -e # Exit on any error
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Default values
|
||||
IMAGE_NAME="tankstopp"
|
||||
TAG="latest"
|
||||
DOCKERFILE="Dockerfile"
|
||||
CONTEXT="."
|
||||
BUILD_ARGS=""
|
||||
PLATFORM=""
|
||||
PUSH=false
|
||||
NO_CACHE=false
|
||||
QUIET=false
|
||||
ENVIRONMENT="production"
|
||||
|
||||
# Functions
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
show_help() {
|
||||
cat << EOF
|
||||
TankStopp Docker Build Script
|
||||
|
||||
Usage: $0 [OPTIONS]
|
||||
|
||||
OPTIONS:
|
||||
-h, --help Show this help message
|
||||
-t, --tag TAG Image tag (default: latest)
|
||||
-e, --env ENV Environment: development|production (default: production)
|
||||
-f, --file FILE Dockerfile path (default: Dockerfile)
|
||||
-c, --context PATH Build context path (default: .)
|
||||
-p, --platform ARCH Target platform (e.g., linux/amd64,linux/arm64)
|
||||
--push Push image to registry after build
|
||||
--no-cache Build without using cache
|
||||
--quiet Suppress build output
|
||||
--build-arg ARG=VALUE Pass build arguments
|
||||
--clean Clean up old images before building
|
||||
|
||||
EXAMPLES:
|
||||
# Build production image
|
||||
$0 --tag v1.0.0 --env production
|
||||
|
||||
# Build development image
|
||||
$0 --tag dev --env development
|
||||
|
||||
# Build multi-platform image
|
||||
$0 --tag latest --platform linux/amd64,linux/arm64
|
||||
|
||||
# Build and push to registry
|
||||
$0 --tag v1.0.0 --push
|
||||
|
||||
# Build with custom build args
|
||||
$0 --build-arg VERSION=1.0.0 --build-arg BUILD_DATE=\$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||||
|
||||
ENVIRONMENT CONFIGURATIONS:
|
||||
production - Optimized for production deployment
|
||||
development - Includes development tools and debugging
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
check_requirements() {
|
||||
log_info "Checking requirements..."
|
||||
|
||||
if ! command -v docker &> /dev/null; then
|
||||
log_error "Docker is not installed or not in PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! docker info &> /dev/null; then
|
||||
log_error "Docker daemon is not running"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$DOCKERFILE" ]; then
|
||||
log_error "Dockerfile not found: $DOCKERFILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$CONTEXT" ]; then
|
||||
log_error "Build context directory not found: $CONTEXT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "Requirements check passed"
|
||||
}
|
||||
|
||||
clean_old_images() {
|
||||
log_info "Cleaning up old images..."
|
||||
|
||||
# Remove old tankstopp images (keep latest 3)
|
||||
OLD_IMAGES=$(docker images "$IMAGE_NAME" --format "{{.Repository}}:{{.Tag}}" | tail -n +4)
|
||||
if [ -n "$OLD_IMAGES" ]; then
|
||||
echo "$OLD_IMAGES" | xargs docker rmi -f 2>/dev/null || true
|
||||
log_success "Cleaned up old images"
|
||||
else
|
||||
log_info "No old images to clean"
|
||||
fi
|
||||
|
||||
# Remove dangling images
|
||||
DANGLING=$(docker images -f "dangling=true" -q)
|
||||
if [ -n "$DANGLING" ]; then
|
||||
echo "$DANGLING" | xargs docker rmi -f 2>/dev/null || true
|
||||
log_success "Removed dangling images"
|
||||
fi
|
||||
}
|
||||
|
||||
prepare_build_args() {
|
||||
log_info "Preparing build arguments..."
|
||||
|
||||
# Add environment-specific build args
|
||||
case "$ENVIRONMENT" in
|
||||
"development")
|
||||
BUILD_ARGS="$BUILD_ARGS --build-arg APP_ENV=development"
|
||||
BUILD_ARGS="$BUILD_ARGS --build-arg DEBUG=true"
|
||||
;;
|
||||
"production")
|
||||
BUILD_ARGS="$BUILD_ARGS --build-arg APP_ENV=production"
|
||||
BUILD_ARGS="$BUILD_ARGS --build-arg DEBUG=false"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Add common build args
|
||||
BUILD_ARGS="$BUILD_ARGS --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')"
|
||||
BUILD_ARGS="$BUILD_ARGS --build-arg VCS_REF=$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')"
|
||||
BUILD_ARGS="$BUILD_ARGS --build-arg VERSION=$TAG"
|
||||
|
||||
log_success "Build arguments prepared"
|
||||
}
|
||||
|
||||
build_image() {
|
||||
log_info "Building Docker image..."
|
||||
log_info "Image: $IMAGE_NAME:$TAG"
|
||||
log_info "Environment: $ENVIRONMENT"
|
||||
log_info "Context: $CONTEXT"
|
||||
log_info "Dockerfile: $DOCKERFILE"
|
||||
|
||||
# Construct docker build command
|
||||
DOCKER_CMD="docker build"
|
||||
|
||||
# Add platform if specified
|
||||
if [ -n "$PLATFORM" ]; then
|
||||
DOCKER_CMD="$DOCKER_CMD --platform $PLATFORM"
|
||||
fi
|
||||
|
||||
# Add no-cache flag if specified
|
||||
if [ "$NO_CACHE" = true ]; then
|
||||
DOCKER_CMD="$DOCKER_CMD --no-cache"
|
||||
fi
|
||||
|
||||
# Add quiet flag if specified
|
||||
if [ "$QUIET" = true ]; then
|
||||
DOCKER_CMD="$DOCKER_CMD --quiet"
|
||||
fi
|
||||
|
||||
# Add build arguments
|
||||
DOCKER_CMD="$DOCKER_CMD $BUILD_ARGS"
|
||||
|
||||
# Add tag and file
|
||||
DOCKER_CMD="$DOCKER_CMD -t $IMAGE_NAME:$TAG"
|
||||
DOCKER_CMD="$DOCKER_CMD -f $DOCKERFILE"
|
||||
DOCKER_CMD="$DOCKER_CMD $CONTEXT"
|
||||
|
||||
log_info "Executing: $DOCKER_CMD"
|
||||
|
||||
# Execute build
|
||||
if eval "$DOCKER_CMD"; then
|
||||
log_success "Docker image built successfully: $IMAGE_NAME:$TAG"
|
||||
else
|
||||
log_error "Docker build failed"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
push_image() {
|
||||
if [ "$PUSH" = true ]; then
|
||||
log_info "Pushing image to registry..."
|
||||
|
||||
if docker push "$IMAGE_NAME:$TAG"; then
|
||||
log_success "Image pushed successfully: $IMAGE_NAME:$TAG"
|
||||
else
|
||||
log_error "Failed to push image"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
show_image_info() {
|
||||
log_info "Image information:"
|
||||
docker images "$IMAGE_NAME:$TAG" --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}\t{{.Size}}"
|
||||
|
||||
# Show image layers (if not quiet)
|
||||
if [ "$QUIET" != true ]; then
|
||||
echo ""
|
||||
log_info "Image layers:"
|
||||
docker history "$IMAGE_NAME:$TAG" --format "table {{.CreatedBy}}\t{{.Size}}" | head -10
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
# Parse command line arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-h|--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
-t|--tag)
|
||||
TAG="$2"
|
||||
shift 2
|
||||
;;
|
||||
-e|--env)
|
||||
ENVIRONMENT="$2"
|
||||
shift 2
|
||||
;;
|
||||
-f|--file)
|
||||
DOCKERFILE="$2"
|
||||
shift 2
|
||||
;;
|
||||
-c|--context)
|
||||
CONTEXT="$2"
|
||||
shift 2
|
||||
;;
|
||||
-p|--platform)
|
||||
PLATFORM="$2"
|
||||
shift 2
|
||||
;;
|
||||
--push)
|
||||
PUSH=true
|
||||
shift
|
||||
;;
|
||||
--no-cache)
|
||||
NO_CACHE=true
|
||||
shift
|
||||
;;
|
||||
--quiet)
|
||||
QUIET=true
|
||||
shift
|
||||
;;
|
||||
--build-arg)
|
||||
BUILD_ARGS="$BUILD_ARGS --build-arg $2"
|
||||
shift 2
|
||||
;;
|
||||
--clean)
|
||||
CLEAN=true
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
log_error "Unknown option: $1"
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Validate environment
|
||||
if [[ "$ENVIRONMENT" != "development" && "$ENVIRONMENT" != "production" ]]; then
|
||||
log_error "Invalid environment: $ENVIRONMENT. Must be 'development' or 'production'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Start build process
|
||||
log_info "Starting TankStopp Docker build process..."
|
||||
|
||||
check_requirements
|
||||
|
||||
if [ "$CLEAN" = true ]; then
|
||||
clean_old_images
|
||||
fi
|
||||
|
||||
prepare_build_args
|
||||
build_image
|
||||
push_image
|
||||
show_image_info
|
||||
|
||||
log_success "Build process completed successfully!"
|
||||
log_info "You can now run the container with:"
|
||||
log_info " docker run -p 8080:8080 $IMAGE_NAME:$TAG"
|
||||
log_info ""
|
||||
log_info "Or use docker-compose:"
|
||||
log_info " docker-compose up -d"
|
||||
}
|
||||
|
||||
# Execute main function
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user