使用 Compose Watch
这watch
属性会在您编辑和保存代码时自动更新和预览正在运行的 Compose 服务。对于许多项目,这样可以在 Compose 运行后实现无需干预的开发工作流程,因为当您保存工作时,服务会自动更新。
watch
遵循以下文件路径规则:
- 所有路径都相对于项目目录
- 以递归方式监视目录
- 不支持 glob 模式
- 规则来自
.dockerignore
应用- 用
ignore
定义要忽略的其他路径的选项(相同的语法) - 常见IDEs(Vim、Emacs、JetBrains等)的临时/备份文件会自动忽略
.git
目录会自动被忽略
- 用
您无需打开watch
对于 Compose 项目中的所有服务。在某些情况下,只有项目的一部分(例如 Javascript 前端)可能适合自动更新。
Compose Watch 旨在与使用build
属性。它不会跟踪依赖于image
属性。
Compose Watch 与 bind 挂载
Compose 支持在服务容器内共享主机目录。监视模式不会取代此功能,而是作为特别适合在容器中开发的伴侣存在。
更重要的是,watch
允许比绑定挂载实际更大的粒度。监视规则允许您忽略监视树中的特定文件或整个目录。
例如,在 JavaScript 项目中,忽略node_modules/
目录有两个好处:
- 性能。在某些配置中,具有许多小文件的文件树可能会导致高 I/O 负载
- 多平台。如果主机 OS 或体系结构与容器不同,则无法共享已编译的项目
例如,在 Node.js 项目中,不建议将node_modules/
目录。即使 JavaScript 被解释,npm
包可以包含无法跨平台移植的本机代码。
配置
这watch
属性 定义一个规则列表,这些规则根据本地文件更改控制自动服务更新。
每条规则都要求path
pattern 和action
在检测到修改时采取。有两种可能的作watch
并且取决于
这action
,则可能会接受或需要其他字段。
Watch 模式可用于许多不同的语言和框架。 具体路径和规则因项目而异,但概念保持不变。
先决条件
为了正常工作,watch
依赖于常见的可执行文件。确保您的服务镜像包含以下Binaries:
- 统计
- mkdir
- rmdir
watch
还要求容器的USER
可以写入目标路径,以便它可以更新文件。常见模式是
要使用COPY
指令。确保拥有此类文件
由配置的用户,使用COPY --chown
旗:
# Run as a non-privileged user
FROM node:18
RUN useradd -ms /bin/sh -u 1001 app
USER app
# Install dependencies
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
# Copy source files into application directory
COPY --chown=app:app . /app
action
同步
如果action
设置为sync
中,Compose 可确保对主机上的文件所做的任何更改都会自动与服务容器中的相应文件匹配。
sync
非常适合支持 “Hot Reload” 或等效功能的框架。
更一般地说,sync
在许多开发用例中,可以使用 rules 代替 Bind 挂载。
重建
如果action
设置为rebuild
时,Compose 会自动使用 BuildKit 构建新镜像并替换正在运行的服务容器。
行为与运行docker compose up --build <svc>
.
Rebuild 非常适合编译语言,或者作为对需要完整
镜像重建(例如package.json
).
同步 + 重启
如果action
设置为sync+restart
中,Compose 会将您的更改与服务容器同步并重新启动它。
sync+restart
在配置文件更改时是理想的,你不需要重新构建镜像,只需重启服务容器的主进程即可。
当您更新数据库配置或nginx.conf
file 例如
提示
path
和target
这target
field 控制路径映射到容器的方式。
为path: ./app/html
并将./app/html/index.html
:
target: /app/html
->/app/html/index.html
target: /app/static
->/app/static/index.html
target: /assets
->/assets/index.html
示例 1
这个最小的示例面向具有以下结构的 Node.js 应用程序:
myproject/
├── web/
│ ├── App.jsx
│ └── index.js
├── Dockerfile
├── compose.yaml
└── package.json
services:
web:
build: .
command: npm start
develop:
watch:
- action: sync
path: ./web
target: /src/web
ignore:
- node_modules/
- action: rebuild
path: package.json
在此示例中,运行docker compose up --watch
,则web
服务使用从Dockerfile
在项目的根目录中。
这web
服务运行npm start
对于其命令,然后启动应用程序的开发版本,并在打包器中启用热模块 Reload(Webpack、Vite、Turbopack 等)。
服务启动后,监视模式开始监控目标目录和文件。
然后,每当web/
目录发生更改后,Compose 会将文件同步到/src/web
在容器内。
例如./web/App.jsx
被复制到/src/web/App.jsx
.
复制后,打包程序会更新正在运行的应用程序,而无需重新启动。
与源代码文件不同,添加新的依赖项不能即时完成,因此无论何时package.json
更改后,Compose
重新构建镜像并重新创建web
服务容器。
许多语言和框架都可以遵循此模式,例如带有 Flask 的 Python:Python 源文件可以同步,同时将requirements.txt
应触发重建。
示例 2
改编前面的示例进行演示sync+restart
:
services:
web:
build: .
command: npm start
develop:
watch:
- action: sync
path: ./web
target: /app/web
ignore:
- node_modules/
- action: sync+restart
path: ./proxy/nginx.conf
target: /etc/nginx/conf.d/default.conf
backend:
build:
context: backend
target: builder
此设置演示了如何使用sync+restart
作,以高效开发和测试具有前端 Web 服务器和后端服务的 Node.js 应用程序。该配置可确保对应用程序代码和配置文件的更改快速同步和应用,并使用web
服务根据需要重新启动以反映更改。
用watch
- 加
watch
部分添加到compose.yaml
. - 跑
docker compose up --watch
以构建并启动 Compose 项目并启动文件监视模式。 - 使用首选的 IDE 或编辑器编辑服务源文件。
注意
手表也可以与专用的
docker compose watch
命令(如果您不想 获取与 (re) build 日志和 Filesystem sync 事件混合的应用程序日志。
提示
退房
dockersamples/avatars
, 或 Docker 文档的本地设置,用于 Compose 演示watch
.
反馈
我们正在积极寻求有关此功能的反馈。提供反馈或报告您在 Compose 规范存储库中可能发现的任何错误。