Skip to content

Commit ed3fff2

Browse files
committed
refactor(docker): 使用 docker-compose 重构容器启动脚本
将原有的直接 docker run 命令重构为基于 docker-compose 的统一管理方式 新增 docker-compose.yml 配置文件集中管理所有服务 保留对 mongodb-replica 的特殊处理 添加相关文档说明重构方案
1 parent 2dd61e7 commit ed3fff2

3 files changed

Lines changed: 576 additions & 172 deletions

File tree

Lines changed: 283 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,283 @@
1+
## 目标
2+
- 用 `docker-compose.yml` 统一管理并启动 `start-container.ps1` 中的各服务,功能等价覆盖:重启策略、日志、数据目录、健康检查、GPU 与现有副本集。
3+
- 在 Windows 11 + Docker Desktop 环境下可直接使用,路径与变量通过 `.env` 控制。
4+
5+
## 总体方案
6+
- 在 `config/dockerfiles/compose/` 新增一个统一的 `docker-compose.yml`,为每个服务设置 `profiles`(与 `ServiceName` 对齐)。
7+
- 新增 `.env` 文件,提供 `DATA_PATH`、`DEFAULT_USER`、`DEFAULT_PASSWORD`、`RESTART_POLICY` 等变量。
8+
- 改造 `start-container.ps1`:根据 `ServiceName` 注入变量后执行 `docker compose -f config/dockerfiles/compose/docker-compose.yml --profile <ServiceName> up -d`。
9+
- 保留并复用现有 `mongo-repl.compose.yml` 以支持 `mongodb-replica`;脚本遇到该服务时直接调用它。
10+
11+
## 目录结构
12+
- `config/dockerfiles/compose/docker-compose.yml`
13+
- `config/dockerfiles/compose/.env`
14+
- 复用:`config/dockerfiles/compose/mongo-repl.compose.yml`
15+
16+
## 参数映射
17+
- `DataPath` → `.env: DATA_PATH`,Compose 中用 `${DATA_PATH}/service/...`
18+
- `DefaultUser`、`DefaultPassword` → `.env: DEFAULT_USER/DEFAULT_PASSWORD`,分别映射到各服务的环境变量(如 MinIO、Mongo、Postgres)。
19+
- `RestartPolicy` → Compose `restart: ${RESTART_POLICY:-unless-stopped}`。
20+
- `$commonParams` 日志 → Compose `logging.driver: json-file`、`options.max-size: 10m`、`options.max-file: "3"`。
21+
- Postgres 健康检查 → Compose `healthcheck`。
22+
23+
## Compose 示例(可直接落地到统一文件)
24+
```yaml
25+
version: "3.8"
26+
services:
27+
redis:
28+
image: redis:latest
29+
container_name: redis-dev
30+
restart: ${RESTART_POLICY:-unless-stopped}
31+
ports: ["6379:6379"]
32+
logging:
33+
driver: "json-file"
34+
options:
35+
max-size: "10m"
36+
max-file: "3"
37+
profiles: ["redis"]
38+
39+
postgre:
40+
image: postgres:latest
41+
container_name: postgre-dev
42+
restart: ${RESTART_POLICY:-unless-stopped}
43+
environment:
44+
POSTGRES_PASSWORD: ${DEFAULT_PASSWORD:-12345678}
45+
TZ: "Asia/Shanghai"
46+
ports: ["5432:5432"]
47+
volumes:
48+
- "${DATA_PATH}/postgresql/data:/var/lib/postgresql/data"
49+
healthcheck:
50+
test: ["CMD-SHELL", "pg_isready -U postgres"]
51+
interval: 10s
52+
timeout: 5s
53+
retries: 3
54+
logging:
55+
driver: "json-file"
56+
options:
57+
max-size: "10m"
58+
max-file: "3"
59+
profiles: ["postgre"]
60+
61+
minio:
62+
image: bitnami/minio:latest
63+
container_name: minio-dev
64+
restart: ${RESTART_POLICY:-unless-stopped}
65+
environment:
66+
MINIO_ROOT_USER: ${DEFAULT_USER:-root}
67+
MINIO_ROOT_PASSWORD: ${DEFAULT_PASSWORD:-12345678}
68+
ports: ["9000:9000", "9001:9001"]
69+
volumes:
70+
- "${DATA_PATH}/minio:/bitnami/minio/data"
71+
logging:
72+
driver: "json-file"
73+
options:
74+
max-size: "10m"
75+
max-file: "3"
76+
profiles: ["minio"]
77+
78+
mongodb:
79+
image: mongo:8
80+
container_name: mongodb-dev
81+
restart: ${RESTART_POLICY:-unless-stopped}
82+
ports: ["27017:27017"]
83+
volumes:
84+
- "${DATA_PATH}/mongodb:/data/db"
85+
logging:
86+
driver: "json-file"
87+
options:
88+
max-size: "10m"
89+
max-file: "3"
90+
profiles: ["mongodb"]
91+
92+
nacos:
93+
image: nacos/nacos-server:latest
94+
container_name: nacos-dev
95+
restart: ${RESTART_POLICY:-unless-stopped}
96+
environment:
97+
MODE: standalone
98+
ports: ["8848:8848"]
99+
logging:
100+
driver: "json-file"
101+
options:
102+
max-size: "10m"
103+
max-file: "3"
104+
profiles: ["nacos"]
105+
106+
rabbitmq:
107+
image: rabbitmq:latest
108+
container_name: rabbitmq-dev
109+
restart: ${RESTART_POLICY:-unless-stopped}
110+
ports: ["5672:5672", "15672:15672"]
111+
logging:
112+
driver: "json-file"
113+
options:
114+
max-size: "10m"
115+
max-file: "3"
116+
profiles: ["rabbitmq"]
117+
118+
prometheus:
119+
image: prom/prometheus:latest
120+
container_name: prometheus-dev
121+
restart: ${RESTART_POLICY:-unless-stopped}
122+
ports: ["39090:9090"]
123+
logging:
124+
driver: "json-file"
125+
options:
126+
max-size: "10m"
127+
max-file: "3"
128+
profiles: ["prometheus"]
129+
130+
n8n:
131+
image: docker.n8n.io/n8nio/n8n:latest
132+
container_name: n8n-dev
133+
restart: ${RESTART_POLICY:-unless-stopped}
134+
ports: ["35678:5678"]
135+
volumes:
136+
- "${DATA_PATH}/n8n:/home/node/.n8n"
137+
logging:
138+
driver: "json-file"
139+
options:
140+
max-size: "10m"
141+
max-file: "3"
142+
profiles: ["n8n"]
143+
144+
noco:
145+
image: nocodb/nocodb:latest
146+
container_name: noco-dev
147+
restart: ${RESTART_POLICY:-unless-stopped}
148+
ports: ["35080:8080"]
149+
volumes:
150+
- "${DATA_PATH}/nocodb:/usr/app/data"
151+
logging:
152+
driver: "json-file"
153+
options:
154+
max-size: "10m"
155+
max-file: "3"
156+
profiles: ["noco"]
157+
158+
crawl4ai:
159+
image: unclecode/crawl4ai:latest
160+
container_name: crawl4ai-dev
161+
restart: ${RESTART_POLICY:-unless-stopped}
162+
ports: ["11235:11235"]
163+
shm_size: "1g"
164+
logging:
165+
driver: "json-file"
166+
options:
167+
max-size: "10m"
168+
max-file: "3"
169+
profiles: ["crawl4ai"]
170+
171+
pageSpy:
172+
image: ghcr.io/huolalatech/page-spy-web:latest
173+
container_name: pageSpy-dev
174+
restart: ${RESTART_POLICY:-unless-stopped}
175+
ports: ["6752:6752"]
176+
volumes:
177+
- "${DATA_PATH}/pageSpy/log:/app/log"
178+
- "${DATA_PATH}/pageSpy/data:/app/data"
179+
logging:
180+
driver: "json-file"
181+
options:
182+
max-size: "10m"
183+
max-file: "3"
184+
profiles: ["pageSpy"]
185+
186+
cadvisor:
187+
image: gcr.io/cadvisor/cadvisor:latest
188+
container_name: cadvisor-dev
189+
restart: ${RESTART_POLICY:-unless-stopped}
190+
ports: ["38181:8080"]
191+
volumes:
192+
- "/:/rootfs:ro"
193+
- "/var/run:/var/run:ro"
194+
- "/sys:/sys:ro"
195+
- "/var/lib/docker/:/var/lib/docker:ro"
196+
- "/dev/disk/:/dev/disk:ro"
197+
privileged: true
198+
devices:
199+
- "/dev/kmsg:/dev/kmsg"
200+
logging:
201+
driver: "json-file"
202+
options:
203+
max-size: "10m"
204+
max-file: "3"
205+
profiles: ["cadvisor"]
206+
207+
one-api:
208+
image: justsong/one-api:latest
209+
container_name: one-api-dev
210+
restart: ${RESTART_POLICY:-unless-stopped}
211+
environment:
212+
TZ: "Asia/Shanghai"
213+
ports: ["39010:3000"]
214+
volumes:
215+
- "${DATA_PATH}/one-api:/data"
216+
logging:
217+
driver: "json-file"
218+
options:
219+
max-size: "10m"
220+
max-file: "3"
221+
profiles: ["one-api"]
222+
223+
new-api:
224+
image: calciumion/new-api:latest
225+
container_name: new-api-dev
226+
restart: ${RESTART_POLICY:-unless-stopped}
227+
environment:
228+
TZ: "Asia/Shanghai"
229+
ports: ["3000:3000"]
230+
volumes:
231+
- "${DATA_PATH}/new-api:/data"
232+
logging:
233+
driver: "json-file"
234+
options:
235+
max-size: "10m"
236+
max-file: "3"
237+
profiles: ["new-api"]
238+
239+
kokoro-fastapi-cpu:
240+
image: ghcr.io/remsky/kokoro-fastapi-cpu:latest
241+
container_name: kokoro-fastapi-dev
242+
restart: ${RESTART_POLICY:-unless-stopped}
243+
ports: ["38880:8880"]
244+
logging:
245+
driver: "json-file"
246+
options:
247+
max-size: "10m"
248+
max-file: "3"
249+
profiles: ["kokoro-fastapi-cpu"]
250+
```
251+
252+
## GPU 服务支持
253+
- `kokoro-fastapi-gpu` 需要 NVIDIA 容器工具链。两种实现方式:
254+
- Compose v2 支持设备预留:在服务下添加 `deploy.resources.reservations.devices`(capabilities: [gpu]),或使用运行时环境变量组合;
255+
- 若本机 Compose 不支持 GPU 字段,则保留脚本对该服务的 `docker run --gpus all` 启动。
256+
257+
## `.env` 示例
258+
```env
259+
DATA_PATH=C:/docker_data
260+
DEFAULT_USER=root
261+
DEFAULT_PASSWORD=12345678
262+
RESTART_POLICY=unless-stopped
263+
```
264+
265+
## 脚本改造要点
266+
- 解析 `ServiceName` → 设置临时环境变量(或写入 `.env`),然后执行:
267+
- `docker compose -f config/dockerfiles/compose/docker-compose.yml --profile <ServiceName> up -d`
268+
- `ServiceName = mongodb-replica` 时:
269+
- 直接执行 `docker compose -p mongo-repl-dev -f config/dockerfiles/compose/mongo-repl.compose.yml up -d`
270+
271+
## 验证方案
272+
- 语法检查:`docker compose -f ... config`
273+
- 启动单服务:`docker compose -f ... --profile redis up -d`
274+
- 停止:`docker compose -f ... --profile redis down`
275+
- 检查日志与重启策略:`docker inspect <container>` 查看 `LogPath` 与 `RestartPolicy`。
276+
277+
## 风险与兼容性
278+
- Windows 路径:Docker Desktop 支持 `C:/...` 与 `C:\...`,统一用前者更稳妥。
279+
- GPU:不同 Compose 版本对 GPU 字段支持差异较大,必要时对 GPU 服务沿用 CLI 方式。
280+
- 网络:当前脚本未启用自定义网络,Compose 使用默认网络即可,后续如需隔离可增设。
281+
282+
## 下一步
283+
- 我将按上述方案新增统一 Compose 与 `.env`,并改造 `start-container.ps1` 为 Compose 包装器,逐个服务验证启动与等价行为。请确认后执行。

0 commit comments

Comments
 (0)