作者搭建 saferun 方案,在 macOS/Linux 上用 Docker 容器隔离 AI 编程 Agent 的执行环境,防止恶意命令破坏宿主机。
为不熟悉的开源项目贡献代码,或让 AI 编程 Agent(比如 OpenCode)执行终端命令时,总会有一丝顾虑。
万一某个构建脚本动了系统 Python,或者某个恶意命令清除了主机文件怎么办?
为此,我构建了 saferun——一个零信任、一次性使用的 Docker 沙箱,专门为 macOS 和 Linux 上的 Python 开发者和 AI Agent 工作流设计。
下面介绍它的工作原理、我不得不解决的权限噩梦,以及如何在两分钟内完成配置。
我想要的开发环境具备以下特性:
绝对隔离:运行时脚本、pytest、ruff 和 AI Agent 命令严格在一次性 Linux 容器内执行。
无缝 IDE 集成:在主机上通过 PyCharm 或 VS Code 编辑的文件能即时同步到容器内。
零权限头痛:沙箱内生成的所有文件属于主机用户账号,而非 root。
持久化加速:通过 uv 缓存包下载,使环境启动始终保持毫秒级速度。
隔离凭证:全局 SSH 和 Git 密钥安全保留在主机上。
容器化开发环境最难的部分是文件所有权。如果你以 root 运行 Docker,AI Agent 生成的任何文件都属于 root,导致你在主机上被锁死。
如果传入本地用户 ID(-u "$(id -u):$(id -g)"),Docker 会将不存在的目录挂载为 root:root,使得 uv 等工具尝试写入缓存目录时触发"权限拒绝"崩溃。
saferun 通过在基础 Dockerfile 中预创建缓存目录并预先授予开放写权限来解决这个问题:
FROM python:3.12-slim
# Install curl (needed to install OpenCode)
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
&& rm -rf /var/lib/apt/lists/*
# Install uv globally
RUN pip install --no-cache-dir uv
# Install OpenCode and dynamically find/copy its binary to /usr/local/bin
RUN curl -fsSL https://opencode.ai/install | bash && \
find /root -name "opencode" -type f -exec cp {} /usr/local/bin/ \;
# Pre-create paths and fix permissions for dynamic non-root UIDs
RUN mkdir -p /uv-cache /app-data /tmp/.config && chmod 777 /uv-cache /app-data /tmp/.config
# Fix the "I have no name!" prompt for dynamic UIDs
RUN echo 'export PS1="Docker Terminal:\w\$ "' >> /etc/bash.bashrc
WORKDIR /app
CMD ["bash"]
基础镜像构建完成后,通过一个终端别名将所有组件串联起来,加入 ~/.zshrc 或 ~/.bashrc:
alias saferun='docker run --rm -it -u "$(id -u):$(id -g)" -e HOME=/tmp -e UV_CACHE_DIR=/uv-cache -e XDG_DATA_HOME=/app-data -v "$(pwd):/app" -v uv-cache:/uv-cache -v ~/.config/opencode:/tmp/.config/opencode -v ~/.local/share/opencode:/app-data/opencode -w /app saferun-base'
其底层运作机制:
--rm:输入 exit 时立即销毁容器。
-v "$(pwd):/app":实时挂载当前工作目录。
-v uv-cache:/uv-cache:挂载专用 Docker 卷用于包缓存。
-v ~/.config/opencode...:映射主机上的 OpenCode 登录信息和 agents.md 设置,无需每次会话重新认证。
在项目根目录打开终端,输入 saferun。
你现在进入了一个隔离的 Linux shell。运行不受信任的代码、让 uv 处理依赖(uv run pytest),或让 opencode 安全地重构代码。
输入 exit。容器消失,而所有代码编辑都安全地保存在你的机器上。
完整的分步安装指南和 Dockerfile 详情已在 GitHub 开源。
👉 github.com/henderson-01/saferun
如果你试用后有任何想法或改进建议,期待在评论区看到你的反馈!