使用撰写手表

Docker Compose 2.22.0版本中引入

用于watch在编辑和保存代码时自动更新和预览正在运行的 Compose 服务。

对于许多项目来说,一旦 Compose 运行,就可以实现不干涉的开发工作流程,因为当您保存工作时,服务会自动更新。

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

  • 所有路径都是相对于项目目录的
  • 递归地观看目录
  • 不支持全局模式
  • 规则.dockerignore适用
    • 使用ignore选项定义要忽略的其他路径(相同语法)
    • 常见 IDE(Vim、Emacs、JetBrains 等)的临时/备份文件将被自动忽略
    • .git目录会被自动忽略

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

Compose Watch 与绑定安装

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

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

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

  • 表现。包含许多小文件的文件树可能会在某些配置中导致高 I/O 负载
  • 多平台。如果主机操作系统或架构与容器不同,则无法共享已编译的工件

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

配置

watch属性定义了一系列规则,用于控制基于本地文件更改的自动服务更新。

每个规则都需要一个path模式,并action在检测到修改时采取。有两种可能的操作,watch并且根据action,可能会接受或需要其他字段。

监视模式可以与许多不同的语言和框架一起使用。具体路径和规则因项目而异,但概念保持不变。

先决条件

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

  • 统计数据
  • 目录
  • 目录
  • 柏油

watch还要求容器USER可以写入目标路径,以便它可以更新文件。一种常见的模式是使用COPYDockerfile 中的指令将初始内容复制到容器中。要确保此类文件由配置的用户拥有,请使用以下COPY --chown标志:

# Run as a non-privileged user
FROM node:18-alpine
RUN useradd -ms /bin/sh -u 1001 app
USER app

# Install dependencies
WORKDIR /app
COPY package.json package.lock .
RUN npm install

# Copy source files into application directory
COPY --chown=app:app . /app

行动

同步

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

sync非常适合支持“热重载”或同等功能的框架。

更一般地说,sync对于许多开发用例,可以使用规则来代替绑定安装。

重建

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

其行为与运行相同docker compose up --build <svc>

重建对于编译语言来说是理想的选择,或者作为对需要完整映像重建的特定文件进行修改的后备(例如package.json)。

同步+重启

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

sync+restart当配置文件发生变化时,您不需要重建镜像,只需重新启动服务容器的主进程即可。nginx.conf例如,当您更新数据库配置或文件时,它会很好地工作

提示

通过图像层缓存多阶段构建来优化您的Dockerfile快速增量重建 。

路径和目标

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

对于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

例子

这个最小的示例针对具有以下结构的 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 watch的容器。该服务为其命令运行,然后启动应用程序的开发版本,并在捆绑器(Webpack、Vite、Turbopack 等)中启用热模块重新加载。webDockerfilewebnpm start

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

复制后,捆绑程序将更新正在运行的应用程序,而无需重新启动。

与源代码文件不同,添加新的依赖项无法即时完成,因此每当package.json发生更改时,Compose 都会重建映像并重新创建web服务容器。

许多语言和框架都可以遵循这种模式,例如带有 Flask 的 Python:Python 源文件可以同步,而更改requirements.txt应该触发重建。

使用手表

  1. 将部分添加watch到 中的一项或多项服务compose.yaml
  2. 运行docker compose watch以构建并启动 Compose 项目并启动文件监视模式。
  3. 使用您喜欢的 IDE 或编辑器编辑服务源文件。

正在寻找示例项目来测试?

查看 Docker 文档dockersamples/avatars或 本地设置 以获取 Compose 演示。watch

反馈

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

参考