Add deploy.sh script for Docker build and deployment
- Add comprehensive deploy.sh script with build, run, push, deploy, and clean commands - Support configurable image tags, registries, and image names - Add Docker deployment documentation to README.md - Update project structure to include deploy.sh
This commit is contained in:
36
README.md
36
README.md
@@ -62,6 +62,41 @@ Edit `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Docker Deployment
|
||||||
|
|
||||||
|
A [`deploy.sh`](deploy.sh:1) script is provided for easy Docker build and deployment.
|
||||||
|
|
||||||
|
### Quick Start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./deploy.sh build # Build the Docker image
|
||||||
|
./deploy.sh run # Run the container locally
|
||||||
|
```
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `build` | Build the Docker image |
|
||||||
|
| `run` | Run the container locally with cache volume |
|
||||||
|
| `push` | Push the image to a registry |
|
||||||
|
| `deploy` | Build and push in one step |
|
||||||
|
| `clean` | Remove local images and containers |
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./deploy.sh build -t v1.0.0 # Build with specific tag
|
||||||
|
./deploy.sh push -r docker.io/myuser/ # Push to Docker Hub
|
||||||
|
./deploy.sh deploy -t v1.0.0 -r ghcr.io/myuser/ # Build and push to GitHub Container Registry
|
||||||
|
```
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
- `IMAGE_TAG` - Image tag (default: latest)
|
||||||
|
- `REGISTRY` - Registry prefix (e.g., "docker.io/username/")
|
||||||
|
- `IMAGE_NAME` - Image name (default: character-details)
|
||||||
|
|
||||||
## Cache
|
## Cache
|
||||||
|
|
||||||
Character data is cached at `~/.local/share/character_details/cache/` as JSON files.
|
Character data is cached at `~/.local/share/character_details/cache/` as JSON files.
|
||||||
@@ -79,6 +114,7 @@ character_details/
|
|||||||
server.py # FastMCP server and tool definitions
|
server.py # FastMCP server and tool definitions
|
||||||
pyproject.toml
|
pyproject.toml
|
||||||
README.md
|
README.md
|
||||||
|
deploy.sh # Docker build and deployment script
|
||||||
```
|
```
|
||||||
|
|
||||||
## Test Characters
|
## Test Characters
|
||||||
|
|||||||
217
deploy.sh
Executable file
217
deploy.sh
Executable file
@@ -0,0 +1,217 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Deploy script for character-details MCP server
|
||||||
|
# Usage: ./deploy.sh [command] [options]
|
||||||
|
#
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
IMAGE_NAME="character-details"
|
||||||
|
IMAGE_TAG="${IMAGE_TAG:-latest}"
|
||||||
|
REGISTRY="${REGISTRY:-}"
|
||||||
|
FULL_IMAGE_NAME="${REGISTRY}${IMAGE_NAME}:${IMAGE_TAG}"
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Helper functions
|
||||||
|
log_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_warn() {
|
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show usage
|
||||||
|
show_usage() {
|
||||||
|
cat << EOF
|
||||||
|
Usage: $0 [command] [options]
|
||||||
|
|
||||||
|
Commands:
|
||||||
|
build Build the Docker image
|
||||||
|
run Run the container locally
|
||||||
|
push Push the image to registry
|
||||||
|
deploy Build and push in one step
|
||||||
|
clean Remove local images and containers
|
||||||
|
help Show this help message
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-t, --tag TAG Set image tag (default: latest)
|
||||||
|
-r, --registry REG Set registry prefix (e.g., "docker.io/username/")
|
||||||
|
-n, --name NAME Set image name (default: character-details)
|
||||||
|
|
||||||
|
Environment Variables:
|
||||||
|
IMAGE_TAG Set image tag
|
||||||
|
REGISTRY Set registry prefix
|
||||||
|
IMAGE_NAME Set image name
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
$0 build # Build with default tag
|
||||||
|
$0 build -t v1.0.0 # Build with specific tag
|
||||||
|
$0 run # Run locally
|
||||||
|
$0 push -r docker.io/myuser/ # Push to Docker Hub
|
||||||
|
$0 deploy -t v1.0.0 -r ghcr.io/myuser/ # Build and push to GitHub Container Registry
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse options
|
||||||
|
parse_options() {
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-t|--tag)
|
||||||
|
IMAGE_TAG="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-r|--registry)
|
||||||
|
REGISTRY="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-n|--name)
|
||||||
|
IMAGE_NAME="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
log_error "Unknown option: $1"
|
||||||
|
show_usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Update full image name
|
||||||
|
FULL_IMAGE_NAME="${REGISTRY}${IMAGE_NAME}:${IMAGE_TAG}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Build the Docker image
|
||||||
|
cmd_build() {
|
||||||
|
log_info "Building Docker image: ${FULL_IMAGE_NAME}"
|
||||||
|
|
||||||
|
# Check if Dockerfile exists
|
||||||
|
if [[ ! -f "Dockerfile" ]]; then
|
||||||
|
log_error "Dockerfile not found in current directory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build the image
|
||||||
|
docker build -t "${FULL_IMAGE_NAME}" -t "${REGISTRY}${IMAGE_NAME}:latest" .
|
||||||
|
|
||||||
|
log_success "Built image: ${FULL_IMAGE_NAME}"
|
||||||
|
log_info "Image size: $(docker images "${FULL_IMAGE_NAME}" --format '{{.Size}}')"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run the container locally
|
||||||
|
cmd_run() {
|
||||||
|
log_info "Running container: ${FULL_IMAGE_NAME}"
|
||||||
|
|
||||||
|
# Create cache directory if it doesn't exist
|
||||||
|
CACHE_DIR="${HOME}/.local/share/character_details"
|
||||||
|
mkdir -p "${CACHE_DIR}"
|
||||||
|
|
||||||
|
log_info "Mounting cache directory: ${CACHE_DIR}"
|
||||||
|
|
||||||
|
# Run the container
|
||||||
|
docker run -it --rm \
|
||||||
|
-v "${CACHE_DIR}:/root/.local/share/character_details" \
|
||||||
|
"${FULL_IMAGE_NAME}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Push the image to registry
|
||||||
|
cmd_push() {
|
||||||
|
log_info "Pushing image: ${FULL_IMAGE_NAME}"
|
||||||
|
|
||||||
|
if [[ -z "${REGISTRY}" ]]; then
|
||||||
|
log_warn "No registry specified. Using Docker Hub default."
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker push "${FULL_IMAGE_NAME}"
|
||||||
|
|
||||||
|
# Also push latest tag
|
||||||
|
docker push "${REGISTRY}${IMAGE_NAME}:latest"
|
||||||
|
|
||||||
|
log_success "Pushed image: ${FULL_IMAGE_NAME}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Build and push in one step
|
||||||
|
cmd_deploy() {
|
||||||
|
cmd_build
|
||||||
|
cmd_push
|
||||||
|
}
|
||||||
|
|
||||||
|
# Clean up local images and containers
|
||||||
|
cmd_clean() {
|
||||||
|
log_info "Cleaning up Docker resources for ${IMAGE_NAME}"
|
||||||
|
|
||||||
|
# Stop and remove containers
|
||||||
|
local containers
|
||||||
|
containers=$(docker ps -aq --filter "ancestor=${REGISTRY}${IMAGE_NAME}")
|
||||||
|
if [[ -n "${containers}" ]]; then
|
||||||
|
log_info "Removing containers..."
|
||||||
|
docker rm -f ${containers}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remove images
|
||||||
|
local images
|
||||||
|
images=$(docker images -q "${REGISTRY}${IMAGE_NAME}")
|
||||||
|
if [[ -n "${images}" ]]; then
|
||||||
|
log_info "Removing images..."
|
||||||
|
docker rmi -f ${images}
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_success "Cleanup complete"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main entry point
|
||||||
|
main() {
|
||||||
|
# Parse global options first
|
||||||
|
parse_options "$@"
|
||||||
|
|
||||||
|
# Get command
|
||||||
|
local command="${1:-help}"
|
||||||
|
shift || true
|
||||||
|
|
||||||
|
case "${command}" in
|
||||||
|
build)
|
||||||
|
cmd_build
|
||||||
|
;;
|
||||||
|
run)
|
||||||
|
cmd_run
|
||||||
|
;;
|
||||||
|
push)
|
||||||
|
cmd_push
|
||||||
|
;;
|
||||||
|
deploy)
|
||||||
|
cmd_deploy
|
||||||
|
;;
|
||||||
|
clean)
|
||||||
|
cmd_clean
|
||||||
|
;;
|
||||||
|
help|--help|-h)
|
||||||
|
show_usage
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_error "Unknown command: ${command}"
|
||||||
|
show_usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
Reference in New Issue
Block a user