| | #!/bin/bash |
| |
|
| | |
| | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| | PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" |
| | CONTAINER_NAME="nodule_seg_pipeline" |
| |
|
| | |
| | if [ -f "$PROJECT_ROOT/.env" ]; then |
| | print_status "Loading environment variables from .env file" |
| | set -a |
| | source "$PROJECT_ROOT/.env" |
| | set +a |
| | elif [ -f "$PROJECT_ROOT/.env.template" ]; then |
| | print_warning "No .env file found. Copy .env.template to .env and customize paths" |
| | print_warning "Using default paths for now" |
| | fi |
| |
|
| | |
| | export PUID=${PUID:-$(id -u)} |
| | export PGID=${PGID:-$(id -g)} |
| | export DATA_PATH=${DATA_PATH:-"$PROJECT_ROOT/demofolder/data"} |
| | export OUTPUT_PATH=${OUTPUT_PATH:-"$PROJECT_ROOT/output"}ical Imaging Nodule Segmentation Pipeline - Run Script |
| | |
| |
|
| | set -e |
| |
|
| | |
| | RED='\033[0;31m' |
| | GREEN='\033[0;32m' |
| | YELLOW='\033[1;33m' |
| | BLUE='\033[0;34m' |
| | NC='\033[0m' |
| |
|
| | |
| | SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| | PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" |
| | CONTAINER_NAME="nodule_seg_pipeline" |
| |
|
| | |
| | print_status() { |
| | echo -e "${BLUE}[INFO]${NC} $1" |
| | } |
| |
|
| | print_success() { |
| | echo -e "${GREEN}[SUCCESS]${NC} $1" |
| | } |
| |
|
| | print_warning() { |
| | echo -e "${YELLOW}[WARNING]${NC} $1" |
| | } |
| |
|
| | print_error() { |
| | echo -e "${RED}[ERROR]${NC} $1" |
| | } |
| |
|
| | |
| | check_docker_compose() { |
| | if command -v docker-compose &> /dev/null; then |
| | DOCKER_COMPOSE="docker-compose" |
| | elif docker compose version &> /dev/null; then |
| | DOCKER_COMPOSE="docker compose" |
| | else |
| | print_error "Docker Compose is not available" |
| | exit 1 |
| | fi |
| | } |
| |
|
| | |
| | show_help() { |
| | echo "Medical Imaging Nodule Segmentation Pipeline - Run Script" |
| | echo "" |
| | echo "Usage: $0 [COMMAND] [OPTIONS]" |
| | echo "" |
| | echo "Commands:" |
| | echo " start Start the container" |
| | echo " stop Stop the container" |
| | echo " restart Restart the container" |
| | echo " run Run the segmentation pipeline" |
| | echo " shell Open interactive shell in container" |
| | echo " jupyter Start Jupyter notebook service" |
| | echo " logs Show container logs" |
| | echo " status Show container status" |
| | echo " clean Clean up containers and volumes" |
| | echo " custom Run custom command in container" |
| | echo "" |
| | echo "Options:" |
| | echo " -h, --help Show this help message" |
| | echo " -f, --follow Follow logs (for logs command)" |
| | echo " -v, --verbose Verbose output" |
| | echo "" |
| | echo "Examples:" |
| | echo " $0 start # Start the container" |
| | echo " $0 run # Run the segmentation pipeline" |
| | echo " $0 shell # Open interactive shell" |
| | echo " $0 logs -f # Follow logs" |
| | echo " $0 custom 'python3 --version' # Run custom command" |
| | echo "" |
| | } |
| |
|
| | |
| | check_status() { |
| | if $DOCKER_COMPOSE ps | grep -q "$CONTAINER_NAME.*Up"; then |
| | return 0 |
| | else |
| | return 1 |
| | fi |
| | } |
| |
|
| | |
| | start_container() { |
| | print_status "Starting the nodule segmentation container..." |
| | |
| | cd "$PROJECT_ROOT" |
| | |
| | if check_status; then |
| | print_warning "Container is already running" |
| | return 0 |
| | fi |
| | |
| | if $DOCKER_COMPOSE up -d nodule-segmentation; then |
| | print_success "Container started successfully!" |
| | |
| | |
| | print_status "Waiting for container to be ready..." |
| | sleep 5 |
| | |
| | |
| | if $DOCKER_COMPOSE exec nodule-segmentation python3 -c "import SimpleITK; print('Container is ready!')" 2>/dev/null; then |
| | print_success "Container is healthy and ready!" |
| | else |
| | print_warning "Container started but health check failed" |
| | fi |
| | else |
| | print_error "Failed to start container" |
| | exit 1 |
| | fi |
| | } |
| |
|
| | |
| | stop_container() { |
| | print_status "Stopping the nodule segmentation container..." |
| | |
| | cd "$PROJECT_ROOT" |
| | |
| | if ! check_status; then |
| | print_warning "Container is not running" |
| | return 0 |
| | fi |
| | |
| | if $DOCKER_COMPOSE stop nodule-segmentation; then |
| | print_success "Container stopped successfully!" |
| | else |
| | print_error "Failed to stop container" |
| | exit 1 |
| | fi |
| | } |
| |
|
| | |
| | restart_container() { |
| | print_status "Restarting the nodule segmentation container..." |
| | stop_container |
| | sleep 2 |
| | start_container |
| | } |
| |
|
| | |
| | run_pipeline() { |
| | print_status "Running the nodule segmentation pipeline..." |
| | |
| | cd "$PROJECT_ROOT" |
| | |
| | if ! check_status; then |
| | print_status "Container is not running. Starting it first..." |
| | start_container |
| | fi |
| | |
| | |
| | if $DOCKER_COMPOSE exec nodule-segmentation test -f "/app/scripts/DLCS24_KNN_2mm_Extend_Seg.sh"; then |
| | print_status "Executing segmentation pipeline..." |
| | if $DOCKER_COMPOSE exec nodule-segmentation bash /app/scripts/DLCS24_KNN_2mm_Extend_Seg.sh; then |
| | print_success "Pipeline executed successfully!" |
| | else |
| | print_error "Pipeline execution failed" |
| | exit 1 |
| | fi |
| | else |
| | print_error "Segmentation script not found in container" |
| | print_status "Available scripts:" |
| | $DOCKER_COMPOSE exec nodule-segmentation ls -la /app/scripts/ || true |
| | exit 1 |
| | fi |
| | } |
| |
|
| | |
| | open_shell() { |
| | print_status "Opening interactive shell in container..." |
| | |
| | cd "$PROJECT_ROOT" |
| | |
| | if ! check_status; then |
| | print_status "Container is not running. Starting it first..." |
| | start_container |
| | fi |
| | |
| | print_status "Entering container shell..." |
| | print_status "Type 'exit' to leave the container" |
| | $DOCKER_COMPOSE exec nodule-segmentation bash |
| | } |
| |
|
| | |
| | start_jupyter() { |
| | print_status "Starting Jupyter notebook service..." |
| | |
| | cd "$PROJECT_ROOT" |
| | |
| | if $DOCKER_COMPOSE --profile jupyter up -d; then |
| | print_success "Jupyter started successfully!" |
| | echo "" |
| | echo "Access Jupyter at: http://localhost:8888" |
| | echo "Token: medical_imaging_2024" |
| | echo "" |
| | echo "To stop Jupyter:" |
| | echo " $DOCKER_COMPOSE --profile jupyter down" |
| | else |
| | print_error "Failed to start Jupyter" |
| | exit 1 |
| | fi |
| | } |
| |
|
| | |
| | show_logs() { |
| | cd "$PROJECT_ROOT" |
| | |
| | if [ "$1" = "-f" ] || [ "$1" = "--follow" ]; then |
| | print_status "Following container logs (Ctrl+C to stop)..." |
| | $DOCKER_COMPOSE logs -f nodule-segmentation |
| | else |
| | print_status "Showing container logs..." |
| | $DOCKER_COMPOSE logs nodule-segmentation |
| | fi |
| | } |
| |
|
| | |
| | show_status() { |
| | print_status "Container status:" |
| | |
| | cd "$PROJECT_ROOT" |
| | |
| | echo "" |
| | echo "=== Docker Compose Services ===" |
| | $DOCKER_COMPOSE ps |
| | |
| | echo "" |
| | echo "=== Container Health ===" |
| | if check_status; then |
| | print_success "Container is running" |
| | |
| | |
| | if command -v docker &> /dev/null; then |
| | echo "" |
| | echo "=== Resource Usage ===" |
| | docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" | grep "$CONTAINER_NAME" || true |
| | fi |
| | |
| | |
| | echo "" |
| | echo "=== Dependency Check ===" |
| | if $DOCKER_COMPOSE exec nodule-segmentation python3 -c " |
| | import SimpleITK |
| | import radiomics |
| | import sklearn |
| | import skimage |
| | import scipy |
| | import pandas |
| | import numpy |
| | print('✓ All dependencies available') |
| | " 2>/dev/null; then |
| | print_success "All dependencies are working" |
| | else |
| | print_warning "Some dependencies may not be working" |
| | fi |
| | else |
| | print_warning "Container is not running" |
| | fi |
| | } |
| |
|
| | |
| | cleanup() { |
| | print_status "Cleaning up containers and volumes..." |
| | |
| | cd "$PROJECT_ROOT" |
| | |
| | |
| | $DOCKER_COMPOSE down --remove-orphans |
| | |
| | |
| | read -p "Remove data volumes? (y/N): " -n 1 -r |
| | echo |
| | if [[ $REPLY =~ ^[Yy]$ ]]; then |
| | $DOCKER_COMPOSE down -v |
| | print_status "Volumes removed" |
| | fi |
| | |
| | print_success "Cleanup completed!" |
| | } |
| |
|
| | |
| | run_custom() { |
| | local command="$1" |
| | |
| | if [ -z "$command" ]; then |
| | print_error "No command provided" |
| | echo "Usage: $0 custom 'your command here'" |
| | exit 1 |
| | fi |
| | |
| | print_status "Running custom command: $command" |
| | |
| | cd "$PROJECT_ROOT" |
| | |
| | if ! check_status; then |
| | print_status "Container is not running. Starting it first..." |
| | start_container |
| | fi |
| | |
| | $DOCKER_COMPOSE exec nodule-segmentation bash -c "$command" |
| | } |
| |
|
| | |
| | main() { |
| | |
| | cd "$PROJECT_ROOT" |
| | |
| | |
| | check_docker_compose |
| | |
| | local command="$1" |
| | shift || true |
| | |
| | case "$command" in |
| | "start") |
| | start_container |
| | ;; |
| | "stop") |
| | stop_container |
| | ;; |
| | "restart") |
| | restart_container |
| | ;; |
| | "run") |
| | run_pipeline |
| | ;; |
| | "shell") |
| | open_shell |
| | ;; |
| | "jupyter") |
| | start_jupyter |
| | ;; |
| | "logs") |
| | show_logs "$@" |
| | ;; |
| | "status") |
| | show_status |
| | ;; |
| | "clean") |
| | cleanup |
| | ;; |
| | "custom") |
| | run_custom "$1" |
| | ;; |
| | "-h"|"--help"|"help"|"") |
| | show_help |
| | ;; |
| | *) |
| | print_error "Unknown command: $command" |
| | echo "" |
| | show_help |
| | exit 1 |
| | ;; |
| | esac |
| | } |
| |
|
| | |
| | main "$@" |