Major breakthrough solving the authentication chicken-and-egg problem: Key Changes: - Copy ~/.claude.json and ~/.claude/ during Docker build for baked-in auth - Add -s user flag to claude mcp add-json for persistent MCP servers - Simplify rebuild logic to prevent unnecessary rebuilds - Update documentation with rebuild instructions Technical Details: - Authentication files placed before USER switch in Dockerfile - MCP configuration now persists across all sessions - Rebuild only occurs when image doesn't exist - Clean separation of build vs runtime concerns Result: Users authenticate once on host, then zero login prompts forever. SMS notifications ready immediately on container start.
71 lines
2.4 KiB
Bash
Executable File
71 lines
2.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# ABOUTME: Wrapper script to run Claude Code in Docker container
|
|
# ABOUTME: Handles project mounting, .claude setup, and environment variables
|
|
|
|
# Get the absolute path of the current directory
|
|
CURRENT_DIR=$(pwd)
|
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
|
|
# Check if .claude directory exists in current project, create if not
|
|
if [ ! -d "$CURRENT_DIR/.claude" ]; then
|
|
echo "Creating .claude directory for this project..."
|
|
mkdir -p "$CURRENT_DIR/.claude"
|
|
|
|
# Copy template files
|
|
cp "$PROJECT_ROOT/templates/.claude/settings.local.json" "$CURRENT_DIR/.claude/"
|
|
cp "$PROJECT_ROOT/templates/.claude/CLAUDE.md" "$CURRENT_DIR/.claude/"
|
|
|
|
# Create scratchpad.md if it doesn't exist
|
|
if [ ! -f "$CURRENT_DIR/scratchpad.md" ]; then
|
|
cp "$PROJECT_ROOT/templates/scratchpad.md" "$CURRENT_DIR/"
|
|
fi
|
|
|
|
echo "✓ Claude configuration created"
|
|
fi
|
|
|
|
# Check if .env exists in claude-docker directory for building
|
|
ENV_FILE="$PROJECT_ROOT/.env"
|
|
if [ -f "$ENV_FILE" ]; then
|
|
echo "✓ Found .env file with credentials"
|
|
else
|
|
echo "⚠️ No .env file found at $ENV_FILE"
|
|
echo " Twilio MCP features will be unavailable."
|
|
echo " To enable: create .env in claude-docker directory with your credentials"
|
|
fi
|
|
|
|
# Check if we need to rebuild the image
|
|
NEED_REBUILD=false
|
|
|
|
if ! docker images | grep -q "claude-docker"; then
|
|
echo "Building Claude Docker image for first time..."
|
|
NEED_REBUILD=true
|
|
fi
|
|
|
|
if [ "$NEED_REBUILD" = true ]; then
|
|
# Copy authentication files to build context
|
|
if [ -f "$HOME/.claude.json" ]; then
|
|
cp "$HOME/.claude.json" "$PROJECT_ROOT/.claude.json"
|
|
fi
|
|
if [ -d "$HOME/.claude" ]; then
|
|
cp -r "$HOME/.claude" "$PROJECT_ROOT/.claude"
|
|
fi
|
|
|
|
docker build --build-arg USER_UID=$(id -u) --build-arg USER_GID=$(id -g) -t claude-docker:latest "$PROJECT_ROOT"
|
|
|
|
# Clean up copied auth files
|
|
rm -f "$PROJECT_ROOT/.claude.json"
|
|
rm -rf "$PROJECT_ROOT/.claude"
|
|
fi
|
|
|
|
# Ensure the claude-home directory exists
|
|
mkdir -p "$HOME/.claude-docker/claude-home"
|
|
|
|
# Run Claude Code in Docker
|
|
echo "Starting Claude Code in Docker..."
|
|
docker run -it --rm \
|
|
-v "$CURRENT_DIR:/workspace" \
|
|
-v "$HOME/.claude-docker/claude-home:/home/claude-user/.claude:rw" \
|
|
--workdir /workspace \
|
|
--name claude-docker-session \
|
|
claude-docker:latest "$@" |