这次在 ECS 上整理了一套给 Coding Agent 使用的开发环境。目标很简单:让它能拉起依赖服务、执行测试、跑 lint,而不是每次都卡在本机环境差异上。
这不是生产部署记录,只是一个开发环境复现记录。
1. 问题现象
代码拉下来后,直接执行测试并不顺:
npm ci
# native module build failed
npm test
# DATABASE_URL missing
docker compose up -d
# redis healthy 之前 api 已经开始连接
这些问题单独看都不大,但对 Coding Agent 来说很致命。它不能靠经验判断“先装哪个系统包”“数据库还要等几秒”“这个变量在我本机 shell 里有”。
2. 固定运行时
先把 Node 版本写进 devcontainer:
{
"name": "ai-ready-dev",
"image": "docker.1ms.run/node:22-alpine",
"forwardPorts": [3000],
"postCreateCommand": "npm ci"
}
如果项目需要更多系统依赖,再改用 Dockerfile:
FROM docker.1ms.run/node:22-alpine
RUN apk add --no-cache bash curl git python3 make g++
WORKDIR /workspace
3. 固定依赖服务
ECS 上用 compose.dev.yaml 跑开发依赖:
services:
app:
image: docker.1ms.run/node:22-alpine
working_dir: /workspace
volumes:
- .:/workspace
env_file:
- .env.example
command: sh -c "npm ci && npm run dev"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
postgres:
image: docker.1ms.run/postgres:16
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: app
POSTGRES_DB: app
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 5s
timeout: 3s
retries: 20
redis:
image: docker.1ms.run/redis:7
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 20
这里的重点是 healthcheck。否则 compose up -d 成功,不代表业务依赖已经可用。
4. 环境变量和任务入口
.env.example 至少要覆盖开发环境必需变量:
DATABASE_URL=postgresql://app:app@postgres:5432/app
REDIS_URL=redis://redis:6379
NODE_ENV=development
任务入口也要固定:
{
"scripts": {
"dev": "vite --host 0.0.0.0",
"lint": "eslint .",
"test": "vitest run",
"db:migrate": "prisma migrate deploy"
}
}
5. 任务前预检
我把下面几条作为 Coding Agent 接任务前的预检:
docker compose -f compose.dev.yaml pull
docker compose -f compose.dev.yaml up -d
docker compose -f compose.dev.yaml ps
npm ci
npm run lint
npm test
基础镜像单独验证:
docker pull docker.1ms.run/node:22-alpine
docker pull docker.1ms.run/python:3.12-slim
docker pull docker.1ms.run/postgres:16
docker pull docker.1ms.run/redis:7
6. 复盘
这套配置解决的不是“让 AI 变聪明”,而是把环境问题提前排掉。
Coding Agent 真正进入项目后,最怕的是错误混在一起:镜像没拉下来、依赖没装好、数据库没 ready、测试入口不统一。环境先可复现,后面再判断代码问题,排查会清楚很多。