在Docker容器隔离环境运行Codex和Claude Code

Codex其实自带沙盒,但我更喜欢放到Docker容器里,然后把工作项目文件通过宿主机的一个目录映射挂载进容器内。
这样能保证宿主机和容器的隔离,防误操作,同时也方便项目文件的查看修改等操作。

1
mkdir -p /opt/docker/agent

这个文件夹用来放工作项目文件和docker compose.yml,创建的路径自己根据需求来。

1
mkdir -p /opt/docker/agent/{.codex,.claude,workspace}

生成CodexClaude Code的配置文件夹,工作项目。(其实Docker -v挂载卷如果对应文件夹不存在,默认会创建)

1
2
cd /opt/docker/agent
vim Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM node:lts-slim

# 安装基础工具,并彻底清理 apt 缓存
RUN apt-get update && apt-get install -y --no-install-recommends \
git \
curl \
sudo \
ca-certificates \
bubblewrap \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# 全局安装 AI 工具,并强制清理 npm 缓存
RUN npm install -g @anthropic-ai/claude-code @openai/codex \
&& npm cache clean --force \
&& rm -rf /root/.npm

WORKDIR /workspace

Docker容器最常见的一般是Alpine版本,但这类Agent工具对Alpine的支持恐怕有限,这里用Debianslim版本。
我已经在这个Dockerfile体现了分层构建的好处,并尽量减少镜像的体积。

1
vim docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
services:
ai-agent:
build: .
container_name: ai-agent
# 保持容器在后台持续运行并允许交互
stdin_open: true
tty: true
restart: unless-stopped
volumes:
# 将宿主机的代码和配置映射进容器的 /root 目录
- ./workspace:/workspace
- ./.claude:/root/.claude
- ./.codex:/root/.codex
1
docker compose up -d

接下来在宿主机添加环境变量方便直接调用工具。

1
vim ~/.bashrc

添加这两行

1
2
alias codex='docker exec -it ai-agent codex'
alias claude='docker exec -it ai-agent claude'

然后:

1
source ~/.bashrc

不出意外的话,直接在宿主机的shell里输入codex或者claude就能直接打开了。
.codex.claude的配置文件有需求的话,自行修改。


平时使用anyrouter比较多。

1
vim config.toml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
model_provider = "AnyRouter"
model = "gpt-5.5"
review_model = "gpt-5.5"
model_reasoning_effort = "xhigh"
plan_mode_reasoning_effort = "xhigh"
approval_policy = "never"
sandbox_mode = "danger-full-access"
disable_response_storage = true
network_access = "enabled"
windows_wsl_setup_acknowledged = true

[model_providers.AnyRouter]
name = "AnyRouter"
base_url = "https://anyrouter.top/v1"
wire_api = "responses"
requires_openai_auth = true

[features]
goals = true

[projects."/workspace"]
trust_level = "trusted"

[mcp_servers.exa]
url = "https://mcp.exa.ai/mcp"

[tui.model_availability_nux]
"gpt-5.5" = 4

provider这个字段如果是OpenAI的话,Codex默认启用的是远程压缩,请求/v1/responses/compact
anyrouter不支持远程压缩,把这个provider换成非OpenAI字段,就可以走本地压缩了。
虽然本地压缩的效果不如远程好。

1
vim AGENTS.md
1
2
3
4
# 全局记忆指令

1. 每次对话开始前应该称呼用户为Alpha。
2. 需要使用网络搜索和抓取 , 即websearch和webfetch功能时,应该使用exa mcp,不要用系统自带的内容。