|
|
#!/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 "$@" |