如何实现文件变更时自动重建Docker镜像并重启容器?
文件变更自动重建Docker镜像并重启容器的实现方案
方法1:用你熟悉的nodemon监听触发
这是最贴合你现有习惯的方式:
- 先确保nodemon已安装,没装的话执行
npm install -D nodemon或yarn add -D nodemon - 修改package.json的scripts,新增一个watch脚本:
"scripts": { "dev": "docker build . -t app1 && docker run -p 3000:8080 app1", "watch": "nodemon --watch . --ext js,json,ts,html,css --exec 'yarn dev'" }
其中--watch .监听当前目录所有文件,--ext指定要监控的文件类型,你可以根据项目需求调整;--exec就是文件变动时要执行的命令。
- 启动监听:执行
yarn watch,之后只要指定类型的文件发生变更,nodemon就会自动执行yarn dev,帮你重建镜像、重启容器。
注意:这种方式每次变更都会全量构建镜像,大项目可能速度偏慢,建议优化Dockerfile的构建缓存——比如先拷贝package.json安装依赖,再拷贝其他代码,依赖未变化时就能复用缓存,加快构建速度。
方法2:用onchange工具监听
不想用nodemon的话,试试onchange工具:
- 安装依赖:
yarn add -D onchange - 修改scripts:
"scripts": { "dev": "docker build . -t app1 && docker run -p 3000:8080 app1", "watch": "onchange '**/*.{js,json,ts,html,css}' -- yarn dev" }
- 执行
yarn watch即可生效。
方法3:Linux/macOS用原生shell工具
不想装npm包的话,用系统自带的inotifywait:
- 先安装inotify-tools:Ubuntu/Debian执行
sudo apt install inotify-tools,macOS用brew install inotify-tools - 编写shell脚本(比如命名为watch.sh):
#!/bin/bash while true; do inotifywait -r -e modify,create,delete . --exclude 'node_modules|.git' yarn dev done
- 给脚本添加执行权限:
chmod +x watch.sh - 运行脚本:
./watch.sh
更高效的优化方案
每次重建镜像效率其实很低,更推荐挂载本地目录到容器,文件变更直接同步到容器内,再结合容器内的nodemon重启服务:
- 修改dev脚本,挂载本地目录:
"scripts": { "dev": "docker run -p 3000:8080 -v $(pwd):/app app1" }
- 调整Dockerfile,确保容器内安装了nodemon,启动命令改用nodemon:
FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN yarn install COPY . . CMD ["nodemon", "server.js"] # 替换成你的实际启动文件
- 这样本地文件修改后,挂载的目录会自动同步到容器,容器内的nodemon会直接重启服务,完全不用重建镜像,速度快很多。
内容的提问来源于stack exchange,提问作者ololo
相关产品推荐
相关产品推荐

