mirror of
https://github.com/anthropics/claude-code.git
synced 2025-10-04 05:42:00 +08:00
152 lines
No EOL
5.2 KiB
PowerShell
152 lines
No EOL
5.2 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Automates the setup and connection to a DevContainer environment using either Docker or Podman on Windows.
|
|
|
|
.DESCRIPTION
|
|
This script automates the process of initializing, starting, and connecting to a DevContainer
|
|
using either Docker or Podman as the container backend. It must be executed from the root
|
|
directory of your project and assumes the script is located in a 'Script' subdirectory.
|
|
|
|
.PARAMETER Backend
|
|
Specifies the container backend to use. Valid values are 'docker' or 'podman'.
|
|
|
|
.EXAMPLE
|
|
.\Script\run_devcontainer_claude_code.ps1 -Backend docker
|
|
Uses Docker as the container backend.
|
|
|
|
.EXAMPLE
|
|
.\Script\run_devcontainer_claude_code.ps1 -Backend podman
|
|
Uses Podman as the container backend.
|
|
|
|
.NOTES
|
|
Project Structure:
|
|
Project/
|
|
├── .devcontainer/
|
|
└── Script/
|
|
└── run_devcontainer_claude_code.ps1
|
|
#>
|
|
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory=$true)]
|
|
[ValidateSet('docker','podman')]
|
|
[string]$Backend
|
|
)
|
|
|
|
# Notify script start
|
|
Write-Host "--- DevContainer Startup & Connection Script ---"
|
|
Write-Host "Using backend: $($Backend)"
|
|
|
|
# --- Prerequisite Check ---
|
|
Write-Host "Checking for required commands..."
|
|
try {
|
|
if (-not (Get-Command $Backend -ErrorAction SilentlyContinue)) {
|
|
throw "Required command '$($Backend)' not found."
|
|
}
|
|
Write-Host "- $($Backend) command found."
|
|
if (-not (Get-Command devcontainer -ErrorAction SilentlyContinue)) {
|
|
throw "Required command 'devcontainer' not found."
|
|
}
|
|
Write-Host "- devcontainer command found."
|
|
}
|
|
catch {
|
|
Write-Error "A required command is not installed or not in your PATH. $($_.Exception.Message)"
|
|
Write-Error "Please ensure both '$Backend' and 'devcontainer' are installed and accessible in your system's PATH."
|
|
exit 1
|
|
}
|
|
|
|
|
|
# --- Backend-Specific Initialization ---
|
|
if ($Backend -eq 'podman') {
|
|
Write-Host "--- Podman Backend Initialization ---"
|
|
|
|
# --- Step 1a: Initialize Podman machine ---
|
|
Write-Host "Initializing Podman machine 'claudeVM'..."
|
|
try {
|
|
& podman machine init claudeVM
|
|
Write-Host "Podman machine 'claudeVM' initialized or already exists."
|
|
} catch {
|
|
Write-Error "Failed to initialize Podman machine: $($_.Exception.Message)"
|
|
exit 1 # Exit script on error
|
|
}
|
|
|
|
# --- Step 1b: Start Podman machine ---
|
|
Write-Host "Starting Podman machine 'claudeVM'..."
|
|
try {
|
|
& podman machine start claudeVM -q
|
|
Write-Host "Podman machine started or already running."
|
|
} catch {
|
|
Write-Error "Failed to start Podman machine: $($_.Exception.Message)"
|
|
exit 1
|
|
}
|
|
|
|
# --- Step 2: Set default connection ---
|
|
Write-Host "Setting default Podman connection to 'claudeVM'..."
|
|
try {
|
|
& podman system connection default claudeVM
|
|
Write-Host "Default connection set."
|
|
} catch {
|
|
Write-Warning "Failed to set default Podman connection (may be already set or machine issue): $($_.Exception.Message)"
|
|
}
|
|
|
|
} elseif ($Backend -eq 'docker') {
|
|
Write-Host "--- Docker Backend Initialization ---"
|
|
|
|
# --- Step 1 & 2: Check Docker Desktop ---
|
|
Write-Host "Checking if Docker Desktop is running and docker command is available..."
|
|
try {
|
|
docker info | Out-Null
|
|
Write-Host "Docker Desktop (daemon) is running."
|
|
} catch {
|
|
Write-Error "Docker Desktop is not running or docker command not found."
|
|
Write-Error "Please ensure Docker Desktop is running."
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
# --- Step 3: Bring up DevContainer ---
|
|
Write-Host "Bringing up DevContainer in the current folder..."
|
|
try {
|
|
$arguments = @('up', '--workspace-folder', '.')
|
|
if ($Backend -eq 'podman') {
|
|
$arguments += '--docker-path', 'podman'
|
|
}
|
|
& devcontainer @arguments
|
|
Write-Host "DevContainer startup process completed."
|
|
} catch {
|
|
Write-Error "Failed to bring up DevContainer: $($_.Exception.Message)"
|
|
exit 1
|
|
}
|
|
|
|
# --- Step 4: Get DevContainer ID ---
|
|
Write-Host "Finding the DevContainer ID..."
|
|
$currentFolder = (Get-Location).Path
|
|
|
|
try {
|
|
$containerId = (& $Backend ps --filter "label=devcontainer.local_folder=$currentFolder" --format '{{.ID}}').Trim()
|
|
} catch {
|
|
$displayCommand = "$Backend ps --filter `"label=devcontainer.local_folder=$currentFolder`" --format '{{.ID}}'"
|
|
Write-Error "Failed to get container ID (Command: $displayCommand): $($_.Exception.Message)"
|
|
exit 1
|
|
}
|
|
|
|
if (-not $containerId) {
|
|
Write-Error "Could not find DevContainer ID for the current folder ('$currentFolder')."
|
|
Write-Error "Please check if 'devcontainer up' was successful and the container is running."
|
|
exit 1
|
|
}
|
|
Write-Host "Found container ID: $containerId"
|
|
|
|
# --- Step 5 & 6: Execute command and enter interactive shell inside container ---
|
|
Write-Host "Executing 'claude' command and then starting zsh session inside container $($containerId)..."
|
|
try {
|
|
& $Backend exec -it $containerId zsh -c 'claude; exec zsh'
|
|
Write-Host "Interactive session ended."
|
|
} catch {
|
|
$displayCommand = "$Backend exec -it $containerId zsh -c 'claude; exec zsh'"
|
|
Write-Error "Failed to execute command inside container (Command: $displayCommand): $($_.Exception.Message)"
|
|
exit 1
|
|
}
|
|
|
|
# Notify script completion
|
|
Write-Host "--- Script completed ---" |