使用 Compose Watch

在 Docker Compose 版本 2.22.0 中引入

该属性会在您编辑和保存代码时自动更新和预览正在运行的 Compose 服务。对于许多项目,这样可以在 Compose 运行后实现无需干预的开发工作流程,因为当您保存工作时,服务会自动更新。watch

watch遵循以下文件路径规则:

  • 所有路径都相对于项目目录
  • 以递归方式监视目录
  • 不支持 glob 模式
  • 规则 from apply.dockerignore
    • 使用 option 定义要忽略的其他路径(相同的语法)ignore
    • 常见IDEs(Vim、Emacs、JetBrains等)的临时/备份文件会自动忽略
    • .git目录会自动被忽略

您无需为 Compose 项目中的所有服务开启。在某些情况下,只有项目的一部分(例如 Javascript 前端)可能适合自动更新。watch

Compose Watch 旨在与使用该属性从本地源代码构建的服务配合使用。它不会跟踪依赖于属性指定的预构建镜像的服务的变化。buildimage

Compose Watch 与 bind 挂载

Compose 支持在服务容器内共享主机目录。监视模式不会取代此功能,而是作为特别适合在容器中开发的伴侣存在。

更重要的是,它允许比 bind 挂载更大的粒度。监视规则允许您忽略监视树中的特定文件或整个目录。watch

例如,在 JavaScript 项目中,忽略目录有两个好处:node_modules/

  • 性能。在某些配置中,具有许多小文件的文件树可能会导致高 I/O 负载
  • 多平台。如果主机 OS 或体系结构与容器不同,则无法共享已编译的项目

例如,在 Node.js 项目中,不建议同步目录。即使 JavaScript 被解释,包也可以包含无法跨平台移植的本机代码。node_modules/npm

配置

该属性定义一个规则列表,这些规则根据本地文件更改控制自动服务更新。watch

每个规则都需要一个模式,并在检测到修改时采取。有两种可能的操作 和 取决于 的 , 其他字段可能为 accepted 或 required 。pathactionwatchaction

Watch 模式可用于许多不同的语言和框架。 具体路径和规则因项目而异,但概念保持不变。

先决条件

为了正常工作,依赖于常见的可执行文件。确保您的服务镜像包含以下二进制文件:watch

  • 统计
  • mkdir
  • rmdir

watch还要求容器可以写入目标路径,以便它可以更新文件。常见模式是 使用 Dockerfile 中的指令将初始内容复制到容器中。确保拥有此类文件 由已配置的用户使用标志:USERCOPYCOPY --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

同步

如果设置为 ,则 Compose 可确保对主机上的文件所做的任何更改都自动与服务容器中的相应文件匹配。actionsync

sync非常适合支持 “Hot Reload” 或等效功能的框架。

更一般地说,在许多开发用例中,可以使用规则代替绑定挂载。sync

重建

如果设置为 ,则 Compose 会自动使用 BuildKit 构建新镜像,并替换正在运行的服务容器。actionrebuild

该行为与运行 .docker compose up --build <svc>

Rebuild 非常适合编译语言,或者作为对需要完整 镜像重建(例如 )。package.json

同步 + 重启

如果设置为 ,则 Compose 会将更改与服务容器同步并重新启动它。actionsync+restart

sync+restart在配置文件更改时是理想的,你不需要重新构建镜像,只需重启服务容器的主进程即可。 例如,当您更新数据库配置或文件时,它将很好地工作nginx.conf

提示

优化您的快速 使用镜像层缓存多阶段构建进行增量重建。Dockerfile

路径目标

该字段控制如何将路径映射到容器中。target

For 和更改为 :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

在此示例中,运行 时,将使用从项目根中构建的镜像启动服务的容器。 该服务为其命令运行,然后启动应用程序的开发版本,并在捆绑程序(Webpack、Vite、Turbopack 等)中启用热模块 Reload。docker compose up --watchwebDockerfilewebnpm start

服务启动后,监视模式开始监控目标目录和文件。 然后,每当目录中的源文件发生更改时,Compose 都会将该文件同步到容器内的相应位置。 例如,将复制到 。web//src/web./web/App.jsx/src/web/App.jsx

复制后,打包程序会更新正在运行的应用程序,而无需重新启动。

与源代码文件不同,添加新的依赖项不能即时完成,因此每当更改时,Compose 重新构建镜像并重新创建服务容器。package.jsonweb

许多语言和框架都可以遵循此模式,例如带有 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

此设置演示了如何使用 Docker Compose 中的操作来高效开发和测试具有前端 Web 服务器和后端服务的 Node.js 应用程序。该配置可确保快速同步和应用对应用程序代码和配置文件的更改,并根据需要重新启动服务以反映更改。sync+restartweb

使用手表

  1. 在 中向一个或多个服务添加部分。watchcompose.yaml
  2. Run 以构建并启动 Compose 项目并启动文件监视模式。docker compose up --watch
  3. 使用首选的 IDE 或编辑器编辑服务源文件。

注意

如果您不想,也可以将 Watch 与专用命令一起使用 获取与 (re) build 日志和 Filesystem sync 事件混合的应用程序日志。docker compose watch

提示

查看 dockersamples/avatars, 或 Docker 文档的本地设置,用于 Compose 的演示。watch

反馈

我们正在积极寻求有关此功能的反馈。提供反馈或报告您在 Compose 规范存储库中可能发现的任何错误。

参考