Edwin Salguero
Add comprehensive Docker Hub integration with deployment scripts and documentation
9fb1755
| # Colors for output | |
| RED='\033[0;31m' | |
| GREEN='\033[0;32m' | |
| YELLOW='\033[1;33m' | |
| BLUE='\033[0;34m' | |
| NC='\033[0m' # No Color | |
| # Function to print colored output | |
| 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" | |
| } | |
| # Default values | |
| DOCKER_USERNAME="" | |
| IMAGE_NAME="algorithmic-trading" | |
| TAG="latest" | |
| REGISTRY="docker.io" | |
| # Function to show help | |
| show_help() { | |
| echo "Usage: $0 [OPTIONS]" | |
| echo "" | |
| echo "Options:" | |
| echo " -u, --username USERNAME Docker Hub username (required)" | |
| echo " -i, --image IMAGE_NAME Image name (default: algorithmic-trading)" | |
| echo " -t, --tag TAG Tag (default: latest)" | |
| echo " -r, --registry REGISTRY Registry URL (default: docker.io)" | |
| echo " -h, --help Show this help message" | |
| echo "" | |
| echo "Examples:" | |
| echo " $0 -u myusername" | |
| echo " $0 -u myusername -i my-trading-system -t v1.0.0" | |
| echo "" | |
| echo "Environment Variables:" | |
| echo " DOCKER_USERNAME Set your Docker Hub username" | |
| echo " DOCKER_PASSWORD Set your Docker Hub password/token" | |
| } | |
| # Parse command line arguments | |
| while [[ $# -gt 0 ]]; do | |
| case $1 in | |
| -u|--username) | |
| DOCKER_USERNAME="$2" | |
| shift 2 | |
| ;; | |
| -i|--image) | |
| IMAGE_NAME="$2" | |
| shift 2 | |
| ;; | |
| -t|--tag) | |
| TAG="$2" | |
| shift 2 | |
| ;; | |
| -r|--registry) | |
| REGISTRY="$2" | |
| shift 2 | |
| ;; | |
| -h|--help) | |
| show_help | |
| exit 0 | |
| ;; | |
| *) | |
| print_error "Unknown option: $1" | |
| show_help | |
| exit 1 | |
| ;; | |
| esac | |
| done | |
| # Check if username is provided | |
| if [ -z "$DOCKER_USERNAME" ]; then | |
| if [ -n "$DOCKER_USERNAME" ]; then | |
| DOCKER_USERNAME="$DOCKER_USERNAME" | |
| else | |
| print_error "Docker Hub username is required!" | |
| echo "Use -u option or set DOCKER_USERNAME environment variable" | |
| show_help | |
| exit 1 | |
| fi | |
| fi | |
| # Function to build the image | |
| build_image() { | |
| print_status "Building Docker image..." | |
| docker build -t ${IMAGE_NAME}:${TAG} . | |
| if [ $? -eq 0 ]; then | |
| print_success "Docker image built successfully" | |
| else | |
| print_error "Failed to build Docker image" | |
| exit 1 | |
| fi | |
| } | |
| # Function to login to Docker Hub | |
| login_to_dockerhub() { | |
| print_status "Logging in to Docker Hub..." | |
| if [ -n "$DOCKER_PASSWORD" ]; then | |
| echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin | |
| else | |
| docker login -u "$DOCKER_USERNAME" | |
| fi | |
| if [ $? -eq 0 ]; then | |
| print_success "Successfully logged in to Docker Hub" | |
| else | |
| print_error "Failed to login to Docker Hub" | |
| exit 1 | |
| fi | |
| } | |
| # Function to tag the image | |
| tag_image() { | |
| local full_image_name="${REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${TAG}" | |
| print_status "Tagging image as: $full_image_name" | |
| docker tag ${IMAGE_NAME}:${TAG} "$full_image_name" | |
| if [ $? -eq 0 ]; then | |
| print_success "Image tagged successfully" | |
| echo "$full_image_name" | |
| else | |
| print_error "Failed to tag image" | |
| exit 1 | |
| fi | |
| } | |
| # Function to push the image | |
| push_image() { | |
| local full_image_name="${REGISTRY}/${DOCKER_USERNAME}/${IMAGE_NAME}:${TAG}" | |
| print_status "Pushing image to Docker Hub: $full_image_name" | |
| docker push "$full_image_name" | |
| if [ $? -eq 0 ]; then | |
| print_success "Image pushed successfully to Docker Hub!" | |
| print_status "You can now pull it with:" | |
| echo " docker pull $full_image_name" | |
| print_status "Or use it in docker-compose with:" | |
| echo " image: $full_image_name" | |
| else | |
| print_error "Failed to push image to Docker Hub" | |
| exit 1 | |
| fi | |
| } | |
| # Function to run tests before pushing | |
| run_tests() { | |
| print_status "Running tests before deployment..." | |
| docker run --rm -v $(pwd):/app ${IMAGE_NAME}:${TAG} pytest -v --tb=short | |
| if [ $? -eq 0 ]; then | |
| print_success "Tests passed" | |
| else | |
| print_warning "Some tests failed, but continuing with deployment..." | |
| fi | |
| } | |
| # Function to clean up local images | |
| cleanup() { | |
| print_status "Cleaning up local images..." | |
| docker rmi ${IMAGE_NAME}:${TAG} 2>/dev/null || true | |
| print_success "Cleanup completed" | |
| } | |
| # Main deployment process | |
| main() { | |
| print_status "Starting Docker Hub deployment..." | |
| print_status "Username: $DOCKER_USERNAME" | |
| print_status "Image: $IMAGE_NAME" | |
| print_status "Tag: $TAG" | |
| print_status "Registry: $REGISTRY" | |
| echo "" | |
| # Build the image | |
| build_image | |
| # Run tests (optional) | |
| read -p "Run tests before deployment? (y/n): " -n 1 -r | |
| echo | |
| if [[ $REPLY =~ ^[Yy]$ ]]; then | |
| run_tests | |
| fi | |
| # Login to Docker Hub | |
| login_to_dockerhub | |
| # Tag the image | |
| local full_image_name=$(tag_image) | |
| # Push the image | |
| push_image | |
| # Cleanup | |
| read -p "Clean up local images? (y/n): " -n 1 -r | |
| echo | |
| if [[ $REPLY =~ ^[Yy]$ ]]; then | |
| cleanup | |
| fi | |
| print_success "Deployment completed successfully!" | |
| print_status "Your image is now available at:" | |
| echo " https://hub.docker.com/r/${DOCKER_USERNAME}/${IMAGE_NAME}" | |
| } | |
| # Run main function | |
| main "$@" |