没有不值得去解决的问题,也没有不值得去学习的技术!

VS Code + Dev Containers + OpenAI Codex 实战:基于 tag-merge 搭建零成本 AI 开发环境

图21:新增 AGENTS.md,用中文约束 Codex 工作规则

作者:

AI 时代开发者变现系统

我的技术博客日 PV 从 2000 跌到 1000:AI 正在吃掉搜索流量

(1) 我的技术博客日 PV 从 2000 跌到 1000:AI 正在吃掉搜索流量

(2) 📘 ChatGPT + Codex 工作流实践:构建我的三层 AI 内容生产系统

Codex驱动的收益型开发路线:用AI重构博客、外包与变现系统(30天执行计划)

(3) Codex驱动的收益型开发路线:用AI重构博客、外包与变现系统(30天执行计划)

图21:新增 AGENTS.md,用中文约束 Codex 工作规则

(4) VS Code + Dev Containers + OpenAI Codex 实战:基于 tag-merge 搭建零成本 AI 开发环境

最近我开始正式尝试把 OpenAI Codex 接入到自己的真实开发流程中。

这次没有选择 Cursor,也没有选择 JetBrains。原因很简单:我已经购买了 ChatGPT Plus,希望尽量在不增加额外软件订阅成本的前提下,把 Codex 跑进实际项目里。

最终我选择的路线是:

Plaintext
VS Code 免费编辑器
+ Dev Containers
+ Docker
+ OpenAI Codex 官方扩展
+ ChatGPT Plus 登录
+ Git 安全提交流程

这篇文章记录的是我基于自己的 tag-merge 项目,从零安装 VS Code,到进入 Dev Container,再到让 Codex 完成第一次真实修改的完整过程。

项目地址:

Plaintext
https://github.com/shuijingwan/tag-merge

一、为什么这次选择 VS Code,而不是 Cursor 或 JetBrains

最开始进入 Codex 页面时,我看到可以选择不同的 IDE:

Plaintext
VS Code
Cursor
JetBrains
Warp

我原本也考虑过 Cursor 和 JetBrains,但最终还是选择了 VS Code。

原因主要有三个。

第一,VS Code 本身免费,不会增加新的订阅成本。

第二,VS Code 官方支持 Dev Containers,这一点对我很重要。之前我在 Trae CN 中尝试 Dev Containers 时并不顺利,所以这次希望用 VS Code 重新走一遍完整流程。

第三,OpenAI 官方 Codex 扩展支持 VS Code,并且可以直接使用 ChatGPT 账号登录。对于已经购买 ChatGPT Plus 的用户来说,这条路线成本最低,也最适合先跑通实际工作流。

图1:Codex 页面中“在 IDE 中试用”的入口,展示 VS Code / Cursor / JetBrains / Warp 选项
图1:Codex 页面中“在 IDE 中试用”的入口,展示 VS Code / Cursor / JetBrains / Warp 选项

不过这里也踩了一个小坑:从 Codex 页面点击 VS Code 后,我被跳转到了 Codex App 的 Linux 通知注册页面。

图2:点击 VS Code 后跳转到 Codex App Linux 通知表单页面
图2:点击 VS Code 后跳转到 Codex App Linux 通知表单页面

这个页面不是我要走的路线。我要使用的是 VS Code 里的 Codex IDE 扩展,不是 Codex 桌面 App。因此后续我没有填写这个表单,而是直接进入 VS Code 安装和扩展配置流程。


二、安装 VS Code

我使用的是 Ubuntu,所以直接安装 VS Code 官方 .deb 包。

执行命令:

Bash
cd ~/下载

wget -O code.deb "https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64"

sudo apt install ./code.deb

安装过程中,系统提示:

Plaintext
Do you want to install the software package?

选择“是”即可。

图3:Ubuntu 安装 VS Code 时提示是否安装软件包
图3:Ubuntu 安装 VS Code 时提示是否安装软件包

安装完成后,执行:

Bash
code --version

输出:

Plaintext
1.127.0
4fe60c8b1cdac1c4c174f2fb180d0d758272d713
x64

说明 VS Code 已经安装成功。

图4:终端中执行 code --version,确认 VS Code 安装成功
图4:终端中执行 code –version,确认 VS Code 安装成功

安装过程中还出现了一个提示:

Plaintext
由于文件 '/home/wangqiang/下载/code.deb' 无法被用户 '_apt' 访问,已脱离沙盒并提权为根用户来进行下载。

这个提示看起来有点吓人,但实际没有影响。它只是说明 _apt 这个低权限用户无法读取本地 .deb 文件,所以 apt 改用 root 权限继续安装。本次安装最终是成功的。


三、切换 VS Code 中文界面

VS Code 首次打开后是英文界面。为了后续操作更直观,我先安装了中文语言包。

操作步骤:

Plaintext
Ctrl + Shift + X
搜索 Chinese
安装 Chinese (Simplified) Language Pack for Visual Studio Code
重启 VS Code
图5:VS Code 安装中文语言包后,界面切换为中文
图5:VS Code 安装中文语言包后,界面切换为中文

中文界面对后续操作帮助很大,尤其是命令面板里的 Dev Containers 命令,虽然内部命令名仍然是英文,但可以通过中文关键词搜索到。

例如:

Plaintext
在容器中重新打开
重新生成
在本地重新打开

这些中文关键词都能帮助快速定位 Dev Containers 相关命令。


四、安装 Dev Containers 扩展

接下来安装 Dev Containers 扩展。

在 VS Code 扩展面板中搜索:

Plaintext
Dev Containers

安装微软官方扩展:

Plaintext
Dev Containers
Publisher: Microsoft
ID: ms-vscode-remote.remote-containers
图6:VS Code 中安装 Dev Containers 扩展
图6:VS Code 中安装 Dev Containers 扩展

这里需要区分一下:

Plaintext
Dev Containers:核心扩展,用于进入开发容器
Container Tools:Docker 管理辅助工具,可选

我这次只安装了 Dev Containers。Container Tools 不是必须的,后续需要更方便地查看容器时再装也可以。


五、打开 tag-merge 项目

接下来在 VS Code 中打开 tag-merge 项目根目录。

注意,这里不是打开单个文件,也不是打开 home 目录,而是打开整个项目目录。

项目结构类似:

Plaintext
tag-merge/
├── .devcontainer/
├── Dockerfile
├── docker-compose.yml
├── go.mod
├── main.go
├── README.md
└── ...
图7:VS Code 中打开 tag-merge 项目根目录
图7:VS Code 中打开 tag-merge 项目根目录

打开项目后,VS Code 会提示是否信任当前文件夹。

由于这是我自己的项目,并且后续需要运行 Docker、Go 命令和 Codex,所以选择:

Plaintext
信任文件夹并继续
图8:VS Code 工作区信任提示,选择信任文件夹并继续
图8:VS Code 工作区信任提示,选择信任文件夹并继续

六、第一次进入 Dev Container

在 VS Code 中按:

Plaintext
Ctrl + Shift + P

搜索中文关键词:

Plaintext
在容器中重新打开

选择:

Plaintext
开发容器: 在容器中重新打开

英文对应命令是:

Plaintext
Dev Containers: Reopen in Container

VS Code 会读取项目里的:

Plaintext
.devcontainer/devcontainer.json
docker-compose.yml
Dockerfile

然后构建并启动开发容器。

成功后,左下角会显示:

Plaintext
开发容器: Tag Merge Dev Container
图9:VS Code 左下角显示“开发容器: Tag Merge Dev Container”
图9:VS Code 左下角显示“开发容器: Tag Merge Dev Container”

进入容器后,在终端中执行:

Bash
go version
go env GOPATH
go env GOPROXY
go mod tidy

一开始 Go 环境可以正常识别:

Plaintext
go version go1.26.4 linux/amd64
GOPATH=/go
图10:Dev Container 终端中执行 go version 和 go env
图10:Dev Container 终端中执行 go version 和 go env

七、安装 OpenAI Codex 扩展并登录

进入 Dev Container 后,我安装 OpenAI 官方 Codex 扩展。

在 VS Code 扩展面板搜索:

Plaintext
Codex

安装:

Plaintext
Codex – OpenAI’s coding agent
Publisher: OpenAI
图11:VS Code 中安装 OpenAI 官方 Codex 扩展
图11:VS Code 中安装 OpenAI 官方 Codex 扩展

安装完成后,在右侧会出现 CODEX 面板。

登录时有两个选项:

Plaintext
通过 ChatGPT 登录
使用 API 密钥

这里一定要选择:

Plaintext
通过 ChatGPT 登录
图12:Codex 扩展中选择“通过 ChatGPT 登录”
图12:Codex 扩展中选择“通过 ChatGPT 登录”

原因是我已经购买了 ChatGPT Plus,希望使用 ChatGPT 账号权益,而不是走 API Key 计费路线。

登录完成后,Codex 面板里可以选择:

Plaintext
推理:中
模型:GPT-5.5
速度:标准

我第一次使用时保持默认:

Plaintext
推理:中
模型:GPT-5.5
速度:标准
图13:Codex 面板中的推理、模型、速度设置
图13:Codex 面板中的推理、模型、速度设置

八、第一次让 Codex 只读分析项目

正式让 Codex 改代码之前,我先让它做只读分析。

提示词如下:

Plaintext
请先分析当前 tag-merge 项目结构,不要修改任何文件。

要求:
1. 说明项目入口文件
2. 说明核心目录和核心模块的作用
3. 说明 docker-compose.yml 的作用
4. 说明 .devcontainer 的作用
5. 说明 main.go 的执行流程
6. 说明这个项目当前如何运行
7. 列出后续适合用 Codex 改进的小任务

限制:
本轮禁止修改任何代码。
本轮禁止执行会改动文件的命令。
只做项目阅读、结构分析和建议。

Codex 请求执行:

Bash
rg --files -g '!vendor'

这个命令只是列出项目文件,属于只读命令,所以我允许执行。

图14:Codex 请求执行 rg --files,只读扫描项目文件
图14:Codex 请求执行 rg –files,只读扫描项目文件

完成后,我执行:

Plaintext
git status

结果是:

Plaintext
nothing to commit, working tree clean

说明 Codex 确实只做了分析,没有修改文件。

图15:Codex 只读分析后,git status 显示工作区干净
图15:Codex 只读分析后,git status 显示工作区干净

九、发现 Dev Container 里默认是 root 用户

接下来我检查当前容器用户:

Bash
whoami && id

输出:

Plaintext
root
uid=0(root) gid=0(root)
图16:Dev Container 中 whoami 显示 root
图16:Dev Container 中 whoami 显示 root

这说明当前 Dev Container 是以 root 用户运行的。

这不是立即错误,但如果后续让 Codex 修改文件,就可能产生一个问题:

Plaintext
容器内 root 写文件
= 宿主机项目目录里出现 root 权限文件

因为项目目录是通过 volume 挂载进容器的:

YAML
- ./:/code

所以容器里的 /code 实际就是宿主机上的项目目录。

既然后续肯定要让 Codex 修改文件,我决定先把 Dev Container 调整为普通用户模式。


十、把 Dev Container 改成非 root 用户

我先退出 Dev Container,回到本地模式:

Plaintext
Ctrl + Shift + P
搜索:在本地重新打开
选择:开发容器: 在本地重新打开文件夹

然后修改 3 个文件:

Plaintext
Dockerfile
docker-compose.yml
.devcontainer/devcontainer.json

1. 修改 Dockerfile

最终 Dockerfile 变为:

Dockerfile
FROM golang:1.26-alpine

ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=1000

# 安装常用开发工具
RUN apk add --no-cache git bash curl

# 创建普通开发用户,避免容器内生成 root 权限文件
RUN addgroup -g ${USER_GID} ${USERNAME} \
    && adduser -D -u ${USER_UID} -G ${USERNAME} -s /bin/sh ${USERNAME}

# 设置 Go 环境目录权限
RUN mkdir -p /go/pkg/mod /go/bin /home/${USERNAME}/.cache/go-build \
    && chown -R ${USERNAME}:${USERNAME} /go /home/${USERNAME}

WORKDIR /code

USER ${USERNAME}

# 保持容器运行(开发模式)
CMD ["tail", "-f", "/dev/null"]

2. 修改 docker-compose.yml

最终 docker-compose.yml 变为:

YAML
services:
  go:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        USER_UID: 1000
        USER_GID: 1000
    container_name: tag-merge
    working_dir: /code
    volumes:
      - ./:/code
      - ~/.gitconfig:/home/vscode/.gitconfig:ro
      - ~/go/pkg/mod-tag-merge:/go/pkg/mod
      - ~/go/build-cache-tag-merge:/home/vscode/.cache/go-build
    tty: true
    stdin_open: true
    environment:
      - GOPROXY=https://goproxy.cn,direct
      - GOSUMDB=sum.golang.google.cn
      - CGO_ENABLED=0
      # 使用 ${} 语法从 .env 文件中读取,不要在这里写明文密钥
      - BAIDU_APP_ID=${BAIDU_APP_ID}
      - BAIDU_SECRET_KEY=${BAIDU_SECRET_KEY}

这里做了几个关键调整:

Plaintext
.gitconfig 挂载到 /home/vscode/.gitconfig
Go build cache 挂载到 /home/vscode/.cache/go-build
GOPROXY 改为 https://goproxy.cn,direct

3. 修改 devcontainer.json

最终 .devcontainer/devcontainer.json 变为:

JSON
{
  "name": "Tag Merge Dev Container",

  "dockerComposeFile": [
    "../docker-compose.yml"
  ],
  "service": "go",
  "workspaceFolder": "/code",

  "shutdownAction": "stopCompose",

  "remoteUser": "vscode",

  "customizations": {
    "vscode": {
      "extensions": [
        "golang.Go",
        "eamodio.gitlens",
        "openai.chatgpt"
      ],
      "settings": {
        "terminal.integrated.defaultProfile.linux": "sh",
        "go.toolsManagement.checkForUpdates": "local",
        "go.useLanguageServer": true,
        "go.gopath": "/go"
      }
    }
  }
}

最关键的是这一行:

JSON
"remoteUser": "vscode"

十一、重建 Dev Container 并修复权限问题

因为修改了 Dockerfile,这次不能普通重新打开容器,而是需要重建:

Plaintext
Ctrl + Shift + P
搜索:重新生成
选择:开发容器: 在容器中重新生成并重新打开
图17:Dev Container 重新生成并重新打开
图17:Dev Container 重新生成并重新打开

重建完成后,再次执行:

Bash
whoami && id

输出:

Plaintext
vscode
uid=1000(vscode) gid=1000(vscode)

说明容器已经切换为普通用户。

图18:whoami 显示 vscode,确认非 root 用户生效
图18:whoami 显示 vscode,确认非 root 用户生效

不过随后执行:

Bash
go mod tidy

遇到了两个权限问题。

第一个:

Plaintext
failed to initialize build cache at /home/vscode/.cache/go-build: permission denied

这是因为宿主机上的 Go build cache 目录可能之前由 root 容器创建。

第二个:

Plaintext
go: updating go.mod: open /code/go.mod: permission denied

这是因为项目目录中的某些文件可能已经被之前 root 容器写成 root 权限。

解决方式是在 Ubuntu 宿主机终端执行:

Bash
sudo chown -R wangqiang:wangqiang /home/wangqiang/code/tag-merge /home/wangqiang/code/tag-merge

以及在 tag-merge 项目根目录执行:

Bash
sudo chown -R wangqiang:wangqiang .
图19:在宿主机终端修复 Go 缓存目录和项目目录权限
图19:在宿主机终端修复 Go 缓存目录和项目目录权限

修复后重新执行:

Bash
go mod tidy
go test ./...

测试结果:

Plaintext
?       tag-merge                       [no test files]
?       tag-merge/cmd/nginx-redirect    [no test files]

说明 Dev Container 切换为普通用户后,Go 环境仍然正常。

图20:go test ./... 执行成功
图20:go test ./… 执行成功

随后提交环境配置:

Bash
git add .devcontainer/devcontainer.json Dockerfile docker-compose.yml
git commit -m "Improve Dev Container non-root setup"
git push

这一步很重要,因为它把“非 root Dev Container 环境”固定成了一个安全检查点。


十二、创建 AGENTS.md,约束 Codex 行为

为了让 Codex 后续在这个项目里更稳定地工作,我让 Codex 创建了 AGENTS.md

第一次 Codex 生成的是英文版,我后来改成中文版本,内容如下:

Markdown
# AGENTS.md

本文件用于指导 Codex 在当前仓库中工作。

## 项目环境

- 本项目运行在 VS Code Dev Container 中。
- 容器内工作目录是 `/code`
- 当前容器用户是 `vscode`,不是 `root`
- 不要假设项目直接运行在宿主机上。
- 如需执行 Go 命令,应在 Dev Container 终端中执行。

## 工作流程

- 修改代码前,必须先说明计划。
- 不要直接进行大范围重构。
- 不要修改与当前任务无关的文件。
- 不要随意新增依赖。
- 不要提交密钥、凭据或 `.env` 文件内容。
- 如果需要修改 Docker、Dev Container 或环境配置,必须先说明原因和影响。

## 测试命令

Go 测试命令:

```sh
go test ./...

修改完成后的说明要求

每次完成修改后,需要说明:

  • 修改了哪些文件。
  • 为什么这样修改。
  • 如何验证修改结果。
  • 是否执行了 go test ./...
  • 当前是否还有未完成事项或风险点。

安全约束

  • 不要删除用户已有代码。
  • 不要覆盖未提交的用户改动。
  • 不要在没有确认的情况下执行破坏性命令。
  • 不要在没有确认的情况下提交代码或推送到远程仓库。
图21:新增 AGENTS.md,用中文约束 Codex 工作规则
图21:新增 AGENTS.md,用中文约束 Codex 工作规则

提交:

Bash
git add AGENTS.md
git commit -m "Add Codex project guidance"
git push

十三、第一次让 Codex 做真实小改动

在完成环境配置和 AGENTS.md 后,我没有马上让 Codex 修改业务代码,而是先让它提出 3 个适合作为第一次练习的小任务。

Codex 给出的建议包括:

Plaintext
1. 修正 README 中 Step 编号不一致
2. 给 .env.example 增加更清晰注释
3. 为 cleanSlug 增加单元测试

我选择了第一个:修正 README 文档中的 Step 编号问题。

提示词大意是:

Plaintext
采用建议 1。
只修改 README.md。
不要修改任何 Go 代码。
不要修改 .env.example、AGENTS.md、Dockerfile、docker-compose.yml、.devcontainer。
不要大范围重写 README。
只做必要的文字修正。

Codex 随后准备修改 README。

图22:Codex 准备修改 README.md,进入审核流程
图22:Codex 准备修改 README.md,进入审核流程

我先没有直接批准,而是通过终端查看 diff:

Bash
git --no-pager diff -- README.md

diff 显示它做了以下调整:

Plaintext
4 个核心步骤 → 5 个核心步骤
补充 Step 4:php/fix-en-chinese-tags.php
原来的 nginx-redirect 调整为 Step 5
all_terms_slug.csv 依赖说明从 Step 4 改为 Step 5
merge_log.json 说明从 Step 4 改为 Step 5

这些修改都在 README.md 内,且和“Step 编号不一致”的问题相关,所以可以接受。

随后检查 Markdown 格式:

Bash
git --no-pager diff --check README.md

没有任何输出,说明没有明显的空格和换行问题。

提交:

Bash
git add README.md
git commit -m "Fix README workflow step numbering"
git push

最后确认:

Bash
git status

输出:

Plaintext
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
图23:最终 git status 显示本地与远程同步,工作区干净
图23:最终 git status 显示本地与远程同步,工作区干净

十四、本次流程总结

这次完整跑通了下面这条路线:

Plaintext
VS Code 安装
→ 中文界面
→ Dev Containers 扩展
→ 打开 tag-merge 项目
→ 进入 Dev Container
→ 安装 OpenAI Codex 扩展
→ 使用 ChatGPT Plus 登录
→ Codex 只读分析项目
→ 发现 root 用户问题
→ 改为 vscode 普通用户
→ 修复权限问题
→ 添加 AGENTS.md
→ Codex 第一次真实修改 README
→ Git commit
→ Git push
→ 工作区干净

对我来说,这次最重要的收获不是“Codex 能不能写代码”,而是建立了一套更安全的 AI 开发流程:

Plaintext
先进入 Dev Container
先确认 Git 干净
先让 Codex 只读分析
先创建 AGENTS.md
小任务开始
只允许修改指定文件
每次看 diff
确认后再 commit
最后 push

这个流程比“直接让 AI 改代码”稳得多。

尤其是对于真实项目,Codex 不是不能用,而是必须放在一个受控流程里使用:

Plaintext
有容器环境
有 Git 检查点
有 AGENTS.md 规则
有 diff 审核
有小步提交

十五、后续计划

今天先到这里。

下一步我准备继续用这个项目做第二个练习:

Plaintext
为 cleanSlug 增加一个小的单元测试

这会比 README 修改更进一步,因为它会进入 Go 测试层面,但风险仍然比较低。

如果这个流程继续稳定,我后续会尝试把 Codex 用到更真实的任务上:

Plaintext
WordPress 标签合并工具优化
Polylang 多语言标签处理
博客 SEO 自动化
联盟链接插入辅助脚本
Nginx 301 跳转规则生成

这次的结论很明确:

对于已经购买 ChatGPT Plus、又希望控制成本的开发者来说,VS Code + Dev Containers + OpenAI Codex 是一条值得优先尝试的低成本 AI 开发路线。

Codex驱动的收益型开发路线:用AI重构博客、外包与变现系统(30天执行计划)

需要长期技术维护或远程问题排查?

我是拥有 15+ 年经验的 PHP / Go 后端工程师,长期关注已有系统维护、Bug 修复、性能优化、服务器排查、WordPress 网站维护和小功能迭代。

如果你的项目遇到以下情况,可以先从一次小问题排查开始合作:

  • ✅ PHP / Laravel / Yii2 老项目无人维护
  • ✅ Go / Gin 后端接口需要排查或优化
  • ✅ WordPress 网站访问慢、报错或插件冲突
  • ✅ Nginx / MySQL / Redis / Linux 服务器异常
  • ✅ CDN / Cloudflare / DNS / HTTPS 配置问题
  • ✅ 需要长期远程技术支持或兼职维护

更多介绍请查看:关于我 & 合作

微信:13980074657
邮箱:shuijingwanwq@gmail.com
Telegram:@shuijingwan
GitHub:https://github.com/shuijingwan

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理