algorithmic_trading / scripts /docker-hub-deploy.sh
Edwin Salguero
Add comprehensive Docker Hub integration with deployment scripts and documentation
9fb1755
#!/bin/bash
# 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 "$@"