用Docker Compose管理开发环境快五年了,分享几个我日常高频使用的技巧。不是入门教程,是那些用了以后"怎么没早点知道"的东西。
1. include:拆分巨大的compose文件
Docker Compose 2.20开始支持include指令。如果你有一个大项目,几十个service全塞在一个docker-compose.yml里,滚动起来像看小说。现在可以拆成多个文件:
# docker-compose.yml include: - compose/database.yml - compose/cache.yml - compose/app.yml
每个子文件里定义相关的service。结构干净了,团队里不同的人改不同部分也不会冲突。2026年这个功能已经稳定,可以放心用。
2. profiles:按需启动服务
不是每次开发都需要所有服务。用profiles控制哪些服务一起启动:
services:
worker:
profiles: ["background"]
elasticsearch:
profiles: ["search", "background"]
日常开发只需要docker compose up(启动没有profile的服务),需要后台任务时加--profile background。比手动启停容器优雅得多。我一般把核心服务(数据库、Redis、应用)设为无profile默认启动,可选的(ES、队列worker、邮件测试工具)加profile。
3. watch:代码改了自动同步
Compose 2.22新增了watch模式,替代手动bind mount+重启。配置示例:
services:
app:
develop:
watch:
- action: sync
path: ./src
target: /app/src
- action: rebuild
path: package.json
改源码→自动sync到容器(不重启);改依赖配置→自动rebuild。比nodemon或webpack-dev-server可靠,因为它是在容器层面管理的。用了一个月,最大的感受是开发体验平滑了——不再需要手动重启容器。
4. env_file可以有多个
一个env_file可以指向多个文件,后面文件的变量会覆盖前面的:
env_file:
- .env.base
- .env.${ENVIRONMENT:-dev}
- .env.local # gitignore的,存本地覆盖
团队里每个人都有自己的.env.local,放个人API key和调试开关。不会互相踩。
5. healthcheck + depends_on condition
旧版的depends_on只等容器启动了,不等服务就绪。新版(Compose 2.21+)支持condition: service_healthy:
depends_on:
postgres:
condition: service_healthy
前提是postgres服务定义了healthcheck(比如用pg_isready)。app容器会等到数据库真正能接受连接了才启动。再也不用在entrypoint脚本里写sleep 10了。
6. init: true 避免僵尸进程
容器里的PID 1如果不处理子进程退出信号,会留下僵尸进程。加一行init: true,Compose会用tini作为init进程:
services:
app:
init: true
特别适合Node.js或Python应用,它们自己不处理SIGCHLD。2026年很多官方镜像默认开了init,但自定义镜像还是得手动加。
7. networks里的name字段
如果多个compose项目需要共享网络,自定义网络名称:
networks:
shared:
name: my-shared-network
external: false
不加name的话,Compose会自动加项目名前缀。加name以后,另一个项目可以直接用同一个网络名。微服务本地开发必备。
最后提醒一点:Docker Compose的版本号概念(version: '3.8')在2026年已经彻底废弃了。新的compose文件不需要声明version。如果你还在老文件里写version: '3',现在可以删掉——什么都不会坏。
标签: Docker Docker Compose 实用技巧 DevOps 开发工具
还木有评论哦,快来抢沙发吧~