核心是绑定挂载代码并启用热重载工具:用-v $(pwd):/app挂载本地目录实现文件实时同步,再通过nodemon(node.js)、air(go)或watchdog(python)等工具监听变化并自动重启进程。
核心就两点:把本地代码挂进容器,再让容器内程序能感知变化并自动重启。
用 -v 挂载本地目录到容器
Bind Mount 是实现热更新的基础。它把宿主机上的真实路径(比如你写代码的文件夹)直接映射进容器内部,任何修改都会立刻出现在容器里。
- 命令行方式:docker run -v $(pwd):/app ... —— 当前目录挂到容器的 /app
- Docker Compose 方式:在 volumes 下写 .:/app,表示当前项目根目录挂载到容器 /app
- 注意路径必须存在,且容器内应用要从挂载点启动(比如 working_dir: /app)
容器内得有监听+重启机制
光挂载还不够。Docker 默认不监听文件变化,你需要额外工具来捕获变更并触发重启。
- Node.js 项目常用 nodemon:在容器里装好后,用 nodemon server.js 启动
- Go 项目推荐 air 或 fresh:它们会扫描 .go 文件,改完自动 rebuild 并 restart 进程
- Python 可用 watchdog + 自定义脚本,或框架自带的 debug 模式(如 Flask 的 --reload)
别忘了配对运行参数
挂载和工具要配合使用,否则挂了也没反应。
- 确保 command 或启动命令调用的是热重载工具,不是原始二进制(比如别写 go run main.go,而要写 air)
- 如果用了 docker-compose.yml,记得把工具作为入口命令,例如:command: air
- 部分工具需要配置监听路径(如 air 默认只看 ./...,挂载后路径匹配才生效)
区分开发与生产,避免误用
Bind Mount 是开发专用手段,不适合生产环境。
- 它暴露宿主机路径,有安全风险;一旦容器删了,挂载目录还在,但内容是实时双向的
- 生产镜像应 COPY 源码并构建,靠镜像层固化,而不是靠挂载动态加载
- 可在 docker-compose 中用 profiles 或多阶段构建,让 dev 和 prod 使用不同配置











