在使用 AI 编码助手时,你是否担心过这些问题:AI 生成的脚本在你的物理机上执行了危险操作?一个实验性的依赖安装污染了全局环境?或者 CI/CD 流水线中 AI 自动生成的代码在不可控的环境中运行?Codex 的 Sandbox 沙箱模式正是为解决这些顾虑而生。它通过将代码执行隔离在容器或受限环境中,让你可以放心地让 AI 执行任意操作,而不会对宿主机造成任何损害。
本文将深入讲解 Codex Sandbox 模式的底层原理、配置方法和实战场景,帮助你在安全与效率之间找到最佳平衡。
Codex 的 Sandbox 模式本质上是一个代码执行隔离层。当你启用沙箱模式后,Codex 不会直接在宿主机的 Shell 中执行命令,而是将所有操作——包括 bash 命令、文件读写、网络请求等——路由到一个隔离的执行环境中。
Codex 支持以下几种沙箱类型:
| 沙箱类型 | 原理 | 隔离程度 | 适用场景 |
|---------|------|---------|---------|
| workspace | 在工作目录内执行,限制访问外部路径 | 低 | 日常开发 |
| docker | 在 Docker 容器中执行所有命令 | 高 | 危险操作、CI/CD |
| local | 直接在本机执行(默认模式,无沙箱) | 无 | 受信任的环境 |
Docker 沙箱需要本地安装 Docker 并启动服务:
# 验证 Docker 是否正常运行
docker info --format '{{.ServerVersion}}'
# 拉取 Codex 推荐的沙箱镜像
docker pull ubuntu:22.04
在项目根目录的 .codex.toml 配置文件中启用 Docker 沙箱:
[sandbox] type = "docker" image = "ubuntu:22.04" # 挂载工作目录到容器内,映射关系可根据需求调整 [sandbox.mounts] workspace = "/workspace" # 环境变量注入到沙箱中 [sandbox.env] NODE_ENV = "development" PYTHONUNBUFFERED = "1" # 网络模式:bridge(默认)/ host / none [sandbox.network] mode = "bridge" # 超时设置(秒) [sandbox.timeout] exec = 300 startup = 60
当标准镜像无法满足需求时,你可以构建自定义沙箱镜像:
# sandbox.Dockerfile
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
curl \
git \
python3 python3-pip \
nodejs npm \
build-essential \
&& rm -rf /var/lib/apt/lists/*
RUN useradd -m -s /bin/bash codex && \
echo "codex ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER codex
WORKDIR /workspace
然后在 .codex.toml 中引用它:
[sandbox] type = "docker" dockerfile = "sandbox.Dockerfile" tag = "codex-sandbox:latest"
对于不需要完全容器隔离的场景,workspace 模式提供了轻量级的路径限制。它通过限制可访问的文件系统路径来防止意外操作:
[sandbox]
type = "workspace"
# 白名单:允许访问的路径
[sandbox.workspace]
allowed_paths = [
"./src",
"./tests",
"./node_modules",
"/tmp/codex-cache"
]
# 禁止执行的危险命令列表
[sandbox.workspace]
blocked_commands = [
"rm -rf /",
"sudo",
"chmod 777",
"mkfs",
"dd if="
]
# 只读路径
[sandbox.workspace]
readonly_paths = [
"./config",
"./.env"
]
> 注意:workspace 模式本质上是路径级别的约束,不能替代真正的安全沙箱。对于执行不可信代码的场景,始终推荐使用 Docker 沙箱。
当你让 Codex 生成一段数据处理脚本时,你不确定它是否会修改关键文件。Sandbox 模式让你可以安全地运行并验证:
# 在 Docker 沙箱中让 Codex 生成并执行脚本 codex exec --sandbox docker "写一个 Python 脚本处理 data.csv 并输出统计报告" # 输出会在沙箱内生成,验证完毕后再决定是否应用到宿主机
在 .codex.toml 中配套设置:
[sandbox] type = "docker" image = "python:3.11-slim" [sandbox.exec] confirm_before_run = true output_capture = true
当项目引入新依赖时,可以先在沙箱中安装验证,避免污染全局环境:
# 在隔离容器中安装依赖
codex exec --sandbox docker "pip install pandas scikit-learn && \
python -c 'import pandas; print(pandas.__version__)'"
自定义沙箱镜像保留缓存可以大幅提升效率:
FROM python:3.11-slim
# 预装常用依赖,减少重复安装
RUN pip install --no-cache-dir \
pandas \
numpy \
requests \
pytest
WORKDIR /workspace
在 GitHub Actions 中使用 Codex Sandbox 进行 AI 辅助的代码审查:
# .github/workflows/codex-review.yml
name: Codex AI Review
on:
pull_request:
branches: [main]
jobs:
review:
runs-on: ubuntu-latest
services:
docker:
image: docker:24-dind
options: --privileged
steps:
- uses: actions/checkout@v4
- name: Run Codex Sandbox Review
run: |
codex exec --sandbox docker \
"审查本次 PR 的所有变更,重点关注安全漏洞和性能问题,\
输出结构化审查报告到 review.md"
- name: Upload Review
uses: actions/upload-artifact@v4
with:
name: codex-review
path: review.md
利用 Sandbox 模式可以快速在不同环境中验证代码:
# 在 Node.js 18 沙箱中测试 codex exec --sandbox docker \ --image node:18-alpine \ "npm install && npm test" # 在 Node.js 20 沙箱中测试 codex exec --sandbox docker \ --image node:20-alpine \ "npm install && npm test" # 在 Node.js 22 沙箱中测试 codex exec --sandbox docker \ --image node:22-alpine \ "npm install && npm test"
在正式执行生产数据库迁移之前,先在沙箱容器中启动一个临时数据库进行演练:
# .codex.toml
[sandbox]
type = "docker"
[sandbox.services]
postgres = { image = "postgres:16", env = { POSTGRES_PASSWORD = "testpass" } }
redis = { image = "redis:7", env = {} }
# 在沙箱中对临时数据库执行迁移脚本 codex exec --sandbox docker " psql postgresql://postgres:testpass@localhost:5432/postgres -f migrations/001_init.sql && \ 运行迁移验证脚本 "
沙箱模式不可避免地会带来一定的性能开销。以下是一些优化策略:
# 利用 Docker 层缓存,将不常变动的依赖放在前面 FROM ubuntu:22.04 # 第一层:基础工具(几乎不变) RUN apt-get update && apt-get install -y curl git # 第二层:语言运行时(偶尔变更) RUN apt-get install -y python3 nodejs # 第三层:项目依赖(频繁变更) COPY requirements.txt /tmp/ RUN pip install -r /tmp/requirements.txt
[sandbox] type = "docker" [[sandbox.volumes]] source = "codex-pip-cache" target = "/root/.cache/pip" [[sandbox.volumes]] source = "codex-npm-cache" target = "/root/.npm"
对于频繁调用的场景,keep-alive 可以避免每次命令都重新创建容器:
[sandbox] type = "docker" [sandbox.lifecycle] keep_alive = true idle_timeout = 600 # 10 分钟无活动后销毁
最小权限原则:沙箱用户不应具有 root 权限,使用 USER 指令降权。
网络隔离:对于仅需本地文件操作的场景,设置 network_mode = "none" 完全断网。
资源限制:防止恶意或错误的脚本耗尽系统资源:
[sandbox.resources] cpu_limit = "2.0" memory_limit = "512m" disk_limit = "1g" pids_limit = 100
只读文件系统:对敏感目录使用只读挂载:
[[sandbox.mounts]] source = "./config" target = "/workspace/config" readonly = true
seccomp 与 AppArmor:为 Docker 沙箱配置安全策略文件:
[sandbox.docker] security_opt = ["seccomp=codex-seccomp.json", "apparmor=codex-profile"]
敏感信息保护:不要在沙箱环境变量中直接写入密钥,使用 Secrets 机制:
[sandbox.secrets]
DB_PASSWORD = { from_env = "SANDBOX_DB_PASSWORD" }
API_KEY = { from_file = "/run/secrets/api_key" }
# 检查 Docker 是否正在运行 docker ps # 检查镜像是否存在 docker images | grep ubuntu # 手动测试容器创建 docker run --rm ubuntu:22.04 echo "sandbox test"
# 调整文件同步策略 [sandbox.sync] strategy = "bind-mount" # 默认策略,适用于本地开发 # 或使用 rsync 策略(适用于远程 Docker) # strategy = "rsync"
当沙箱内的服务需要暴露端口时:
codex exec --sandbox docker \ --publish 8080:8080 \ "python -m http.server 8080"
Codex 的 Sandbox 沙箱模式为 AI 辅助编程提供了一道关键的安全防线。从轻量级的 workspace 路径限制到完整的 Docker 容器隔离,你可以根据场景灵活选择合适的隔离级别。核心收益可以总结为三点:
安全隔离:AI 生成代码的执行不会影响宿主机环境,无论是误操作还是恶意代码。
环境一致性:沙箱提供可复现的执行环境,消除"在我机器上能跑"的问题。
CI/CD 友好:沙箱模式天然适合集成到自动化流水线中,实现 AI 驱动的安全代码审查和自动化测试。
建议在项目中遵循"沙箱优先"的原则:当 Codex 需要执行你不完全理解的命令时,默认使用 Docker 沙箱;只有在充分信任的日常操作中才使用 local 模式。这样的习惯能帮助你在享受 AI 编程效率的同时,始终守住安全底线。