This directory contains all Docker-related configurations for the AI Robo Advisor project. The setup provides a consistent, cross-platform development environment that eliminates "works on my machine" issues.
docker/
βββ README.md # This guide
βββ Dockerfile # Multi-stage build configuration
βββ docker-compose.yml # Multi-service orchestration
βββ .dockerignore # Files excluded from build context
βββ validate-setup.sh # Setup validation and verification script
- Docker and Docker Compose installed
- Git repository cloned
# Start development environment
./docker-run.sh
# Or specific commands
./docker-run.sh up --build
./docker-run.sh down
./docker-run.sh logs -fcd docker/
# Start development environment
../docker-run.sh
# Or use docker-compose directly
docker-compose up --build # or docker compose up --build# Navigate to project root
cd ai-robo-advisor
# Create environment file
cp .env.example .env
# Edit .env with your API keys
nano .env # or your preferred editor# Run validation script
./docker/validate-setup.sh# Development mode (default)
docker-compose up
# Or use helper script
./docker/docker-helper.sh upThe Dockerfile uses a multi-stage build approach for optimized images:
-
Base Stage (
base)- Python 3.11 slim base image
- System dependencies (gcc, g++)
- Non-root user setup
- Environment variables
-
Dependencies Stage (
dependencies)- Application dependencies installation
- Source code copying
- Python package installation
-
Development Stage (
development)- Development and testing dependencies
- Test files and configuration
- Hot-reload support via volume mounts
-
Production Stage (
production)- Optimized for deployment
- No development dependencies
- Health checks included
-
Interactive Stage (
interactive)- Enhanced with additional tools (curl, nano, vim)
- Perfect for exploration and debugging
- Default: Development mode with hot-reload
- Interactive: Shell access for exploration
- Production: Optimized deployment configuration
# Start development environment
docker-compose up
# Start in background
docker-compose up -d
# Interactive shell
docker-compose --profile interactive up ai-robo-advisor-interactive
# Production mode
docker-compose --profile production up ai-robo-advisor-prod
# Stop containers
docker-compose down
# View logs
docker-compose logs -f
# Run one-off commands
docker-compose run --rm ai-robo-advisor python -m main --help# From project root (recommended)
../docker-run.sh # Start development
../docker-run.sh interactive # Interactive shell
../docker-run.sh test # Run tests
../docker-run.sh shell # Shell in running container
../docker-run.sh down # Stop containers
../docker-run.sh clean # Clean up everything
../docker-run.sh help # Show all commandsPOLYGON_API_KEY- Financial data API (required)- At least one LLM provider:
GOOGLE_API_KEY- Google Gemini modelsOPENAI_API_KEY- OpenAI GPT modelsANTHROPIC_API_KEY- Anthropic Claude models
PYTHONPATH=/app/src- Python module resolutionENVIRONMENT- Runtime mode (development/production)PYTHONDONTWRITEBYTECODE=1- No .pyc filesPYTHONUNBUFFERED=1- Real-time output
# .env file example
POLYGON_API_KEY=your-actual-polygon-key
GOOGLE_API_KEY=your-actual-google-key
OPENAI_API_KEY=your-actual-openai-key
ANTHROPIC_API_KEY=your-actual-anthropic-key- Source code is mounted as volumes for hot-reload
- Changes in
src/automatically reflected in container - No need to rebuild for source code changes
- If
pyproject.tomlchanges, rebuild with:
docker-compose up --build
# or
./docker/docker-helper.sh up --rebuild# Run tests in container
./docker/docker-helper.sh test
# Or directly
docker-compose run --rm ai-robo-advisor pytest tests/ -v
# With coverage
docker-compose run --rm ai-robo-advisor pytest tests/ --cov=src# Start interactive session
./docker/docker-helper.sh interactive
# Inside container, you can:
python -m main # Run application
pytest tests/ # Run tests
python -c "import main; help(main)" # Explore code# Error: Cannot connect to Docker daemon
# Solution: Start Docker service
sudo systemctl start docker # Linux
# or start Docker Desktop # Windows/Mac# Error: Permission denied for docker commands
# Solution: Add user to docker group (Linux)
sudo usermod -aG docker $USER
# Log out and back in# Error: Port already allocated
# Solution: Stop existing containers
docker-compose down
docker ps # Check for other containers# Check .env file exists and has correct format
cat .env
# Ensure no spaces around = in .env file# Clean build
./docker/docker-helper.sh clean
docker-compose build --no-cache
# Check Docker space
docker system df
docker system prune # if needed# Check container logs
docker-compose logs ai-robo-advisor
# Check container status
docker-compose ps
# Enter running container
docker exec -it ai-robo-advisor-dev /bin/bash
# Check environment inside container
docker-compose run --rm ai-robo-advisor env
# Test specific functionality
docker-compose run --rm ai-robo-advisor python -c "import sys; print(sys.path)"- Update
pyproject.toml - Rebuild container:
docker-compose up --build
- Edit
docker/Dockerfilefor image changes - Edit
docker-compose.ymlfor service configuration - Test changes with validation script
# In docker-compose.yml
services:
database:
image: postgres:15
environment:
- POSTGRES_DB=robo_advisor
volumes:
- postgres_data:/var/lib/postgresql/data- Use
.dockerignoreto exclude unnecessary files - Multi-stage builds already optimize layer caching
- Consider using Docker BuildKit:
DOCKER_BUILDKIT=1 docker-compose build
- Debian slim base images used
apt-get cleanremoves package cache- Multi-stage builds exclude development dependencies in production
- Volume mounts enable hot-reload
- Dependencies cached in Docker layers
- Use
docker-compose up -dfor background running
- Non-root user (
appuser) execution - No secrets in Dockerfile or images
- Environment variable injection only
- Use
.envfile (never committed) - Validate keys with validation script
- Separate development/production environments
- Containers isolated in custom network
- Only necessary ports exposed
- No privileged containers
If you encounter issues:
- Run validation script:
./docker/validate-setup.sh - Check logs:
docker-compose logs - Verify environment: Ensure
.envfile has valid API keys - Clean restart:
./docker/docker-helper.sh clean && ./docker/docker-helper.sh up - Check GitHub issues: Search for similar problems
- Create new issue: Provide validation script output and error logs