关于 devcontainers-nix
这项技能指南介绍如何使用 Dev Containers、Nix Flakes 和 Devbox 创建可复现的开发环境,适合统一本地与 CI 工具链的开发者和团队,并提供配置、自动激活与自动化范例。
主要功能
- 01使用 Docker 配置 Dev Containers
- 02通过 Nix Flakes 固定环境依赖
- 03使用 Devbox 管理软件包与脚本
- 04通过 direnv 自动激活环境
- 05将环境接入 CI 和 Codespaces
适用场景
- 01统一开发团队的工具链
- 02使本地开发环境与 CI 保持一致
- 03为新成员准备已配置的工作区
- 04创建临时开发环境
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill devcontainers-nix安装后在 Claude Code 中输入/devcontainers-nix确认已加载。
详细介绍
Dev Containers 与 Nix 环境
可复现、可移植的开发环境,消除环境漂移。
何时使用此技能
在以下情况使用此技能:
- 新开发者入职(几分钟内即可从零开始高效工作)
- 在团队内统一工具链
- 消除“在我的机器上能运行”的问题
- 设置与本地开发环境一致的 CI 环境
- 创建临时、可丢弃的开发环境
Dev Containers
基本配置
// .devcontainer/devcontainer.json
{
"name": "My Project",
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-22.04",
"features": {
"ghcr.io/devcontainers/features/node:1": { "version": "20" },
"ghcr.io/devcontainers/features/python:1": { "version": "3.12" },
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
"ghcr.io/devcontainers/features/kubectl-helm-minikube:1": {}
},
"forwardPorts": [3000, 5432],
"postCreateCommand": "npm install",
"customizations": {
"vscode": {
"extensions": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"ms-python.python"
],
"settings": {
"editor.formatOnSave": true
}
}
}
}
Docker Compose Dev Container
// .devcontainer/devcontainer.json
{
"name": "Full Stack Dev",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/workspace",
"forwardPorts": [3000, 5432, 6379],
"postCreateCommand": "npm install && npx prisma migrate dev"
}
# .devcontainer/docker-compose.yml
services:
app:
build:
context: ..
dockerfile: .devcontainer/Dockerfile
volumes:
- ..:/workspace:cached
command: sleep infinity
depends_on: [db, redis]
db:
image: postgres:16
environment:
POSTGRES_DB: dev
POSTGRES_USER: dev
POSTGRES_PASSWORD: dev
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
pgdata:
自定义 Dockerfile
# .devcontainer/Dockerfile
FROM mcr.microsoft.com/devcontainers/base:ubuntu-22.04
# System dependencies
RUN apt-get update && apt-get install -y \
build-essential \
curl \
git \
jq \
unzip \
&& rm -rf /var/lib/apt/lists/*
# Install project-specific tools
RUN curl -fsSL https://get.opentofu.org/install-opentofu.sh | sh -s -- --install-method standalone
RUN curl -LO "https://dl.k8s.io/release/$(curl -sL https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" \
&& install kubectl /usr/local/bin/
# Non-root user setup
USER vscode
WORKDIR /workspace
Nix Flakes
基本 Flake
# flake.nix
{
description = "Project development environment";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
in {
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
# Languages
nodejs_20
python312
go_1_22
rustc
cargo
# Tools
docker-compose
kubectl
kubernetes-helm
opentofu
awscli2
jq
yq-go
# Databases
postgresql_16
redis
];
shellHook = ''
echo "Dev environment loaded"
export PROJECT_ROOT=$(pwd)
export PATH="$PROJECT_ROOT/node_modules/.bin:$PATH"
'';
};
}
);
}
# Enter the dev shell
nix develop
# Or run a single command
nix develop --command bash -c "node --version && go version"
# Build and run
nix build
nix run
锁定依赖项
# Lock flake inputs for reproducibility
nix flake lock
nix flake update # Update all inputs
# Update a specific input
nix flake lock --update-input nixpkgs
Devbox(让 Nix 更简单)
Devbox 以更友好的界面封装 Nix:
# Install Devbox
curl -fsSL https://get.jetify.com/devbox | bash
# Initialize project
devbox init
# Add packages
devbox add nodejs@20 [email protected] postgresql@16
devbox add [email protected] kubectl helm
# Enter shell
devbox shell
# Run commands without entering shell
devbox run node --version
devbox.json 配置
{
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/main/.schema/devbox.schema.json",
"packages": [
"nodejs@20",
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]",
"postgresql@16",
"redis@7"
],
"env": {
"PROJECT_ROOT": "$PWD",
"DATABASE_URL": "postgresql://localhost:5432/dev"
},
"shell": {
"init_hook": [
"echo 'Dev environment ready'",
"npm install --silent 2>/dev/null || true"
],
"scripts": {
"dev": "npm run dev",
"test": "npm test",
"db:start": "pg_ctl -D .devbox/virtenv/postgresql/data start",
"db:stop": "pg_ctl -D .devbox/virtenv/postgresql/data stop",
"db:migrate": "npx prisma migrate dev"
}
}
}
# Run project scripts
devbox run dev
devbox run test
devbox run db:start
# Generate direnv integration (auto-activate on cd)
devbox generate direnv
# Generate Dockerfile from devbox config
devbox generate dockerfile
Devbox + direnv(自动激活)
# Install direnv
devbox add direnv
# Generate .envrc
devbox generate direnv
# Allow direnv
direnv allow
# .envrc (auto-generated)
eval "$(devbox generate direnv --print-envrc)"
现在,进入项目目录时会自动加载环境。
CI/CD 集成
使用 Devbox 的 GitHub Actions
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: jetify-com/[email protected]
with:
enable-cache: true
- run: devbox run test
- run: devbox run lint
使用 Nix 的 GitHub Actions
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: cachix/install-nix-action@v26
with:
nix_path: nixpkgs=channel:nixos-unstable
- uses: cachix/cachix-action@v14
with:
name: my-project
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
- run: nix develop --command bash -c "npm ci && npm test"
GitHub Codespaces
// .devcontainer/devcontainer.json — works in Codespaces
{
"name": "Codespaces Dev",
"image": "mcr.microsoft.com/devcontainers/universal:2",
"features": {
"ghcr.io/devcontainers/features/node:1": { "version": "20" }
},
"postCreateCommand": "npm install",
"portsAttributes": {
"3000": { "label": "App", "onAutoForward": "openBrowser" },
"5432": { "label": "Postgres", "onAutoForward": "ignore" }
}
}
对比
| 特性 | Dev Containers | Nix Flakes | Devbox |
|---|---|---|---|
| 学习曲线 | 低 | 高 | 低 |
| 可复现性 | 良好(Docker) | 极佳 | 极佳(Nix) |
| 速度 | 慢(构建镜像) | 快(有缓存) | 快(有缓存) |
| IDE 支持 | VS Code、JetBrains | 任意终端 | 任意终端 |
| CI 集成 | 基于 Docker | Nix actions | Devbox action |
| 离线支持 | 有限 | 完整 | 完整 |
| macOS/Linux/Win | 全部 | macOS/Linux | macOS/Linux |
最佳实践
- 明确锁定所有工具版本,切勿使用
latest - 提交锁文件(
flake.lock、devbox.lock等) - 使用 direnv 自动激活环境
- 在 CI 中缓存 Nix store(Cachix 或 GitHub cache)
- 在 README 中说明设置方法:
devbox shell或nix develop - 让开发环境尽可能贴近生产环境(使用相同的 Node/Python 版本)
故障排除
| 问题 | 解决方案 |
|---|---|
| Nix 首次构建速度较慢 | 使用二进制缓存(Cachix);首次运行后,nix develop 会缓存结果 |
| Dev Container 无法构建 | 检查 Docker 磁盘空间;使用 --no-cache 重新构建 |
| Nixpkgs 中没有所需的软件包 | 在 search.nixos.org 上搜索,或使用 fetchFromGitHub overlay |
| Devbox 哈希不匹配 | 运行 devbox update,删除 .devbox/ 并重新初始化 |
| direnv 未激活 | 运行 direnv allow,检查是否已安装 shell hook |
相关技能
- docker-management — 容器镜像优化
- github-actions — CI/CD 流水线设置
- linux-administration — 系统级工具
评论
支持 Markdown