DevContainer Feature Creator
Create DevContainer features efficiently using proven patterns from this repository.
Feature Structure
Every feature consists of exactly two files:
code
features/<feature-name>/ ├── devcontainer-feature.json # Metadata definition └── install.sh # Installation script
devcontainer-feature.json Schema
Required Fields
json
{
"id": "<feature-name>", // kebab-case, matches folder name
"version": "1.0.0", // semver format
"name": "Human Readable Name",
"description": "Brief description of what this feature installs"
}
Optional Fields
json
{
"options": {
"version": {
"type": "string",
"default": "latest",
"description": "Version to install"
}
},
"installsAfter": [
"ghcr.io/devcontainers/features/node" // Dependencies
],
"postStartCommand": "command to run after container starts"
}
install.sh Patterns
Five proven patterns exist. See references/install-patterns.md for complete templates.
| Pattern | Use Case | Example |
|---|---|---|
| npm | Node.js packages | claude-code, editorconfig-prettier |
| binary | Pre-built binaries from GitHub | lazygit, copilot-cli, yazi |
| source | Build from source | luarocks |
| dotnet | .NET global tools | easydotnet |
| setup | Directory/config setup | vimcontainer-setup |
Creation Workflow
Step 1: Initialize Feature
Run the initialization script:
bash
python3 scripts/init_feature.py <feature-name> <pattern>
Patterns: npm, binary, source, dotnet, setup
Step 2: Edit devcontainer-feature.json
- •Update
nameanddescription - •Add
optionsif configurable (e.g., version) - •Add
installsAfterif dependencies exist
Step 3: Edit install.sh
- •Replace placeholder values
- •Add error handling
- •Test installation
Step 4: Test Feature
bash
# Build and test locally devcontainer features test -f <feature-name> .
Best Practices
install.sh Guidelines
- •Always start with:
#!/bin/bashandset -e - •Version handling:
VERSION="${VERSION:-default}" - •Architecture detection (for binaries):
bash
ARCH=$(dpkg --print-architecture) case "$ARCH" in amd64) TARGET_ARCH="x86_64" ;; arm64) TARGET_ARCH="arm64" ;; *) echo "Unsupported: $ARCH"; exit 1 ;; esac - •Dependency checks: Verify required tools before use
- •Cleanup: Remove temp files and apt cache
- •Verification: Confirm installation succeeded
Error Handling
- •Check command availability before use
- •Provide clear error messages
- •Exit with non-zero code on failure
- •Validate downloaded files (check gzip magic bytes)
User Context
For user-specific installations:
bash
INSTALL_USER="${_REMOTE_USER:-${USERNAME:-vscode}}"
USER_HOME=$(getent passwd "${INSTALL_USER}" | cut -d: -f6)
Resources
- •Initialization script:
scripts/init_feature.py- Generate feature scaffolding - •Pattern templates:
references/install-patterns.md- Detailed templates for each pattern