使用撰写手表
用于watch
在编辑和保存代码时自动更新和预览正在运行的 Compose 服务。
对于许多项目来说,一旦 Compose 运行,就可以实现不干涉的开发工作流程,因为当您保存工作时,服务会自动更新。
watch
遵守以下文件路径规则:
- 所有路径都是相对于项目目录的
- 递归地观看目录
- 不支持全局模式
- 规则
.dockerignore
适用- 使用
ignore
选项定义要忽略的其他路径(相同语法) - 常见 IDE(Vim、Emacs、JetBrains 等)的临时/备份文件将被自动忽略
.git
目录会被自动忽略
- 使用
您无需打开watch
Compose 项目中的所有服务。在某些情况下,只有项目的一部分(例如 Javascript 前端)可能适合自动更新。
Compose Watch 与绑定安装
Compose 支持在服务容器内共享主机目录。监视模式不会取代此功能,而是作为专门适合在容器中开发的伴侣而存在。
更重要的是,watch
与绑定安装相比,它允许更大的粒度。监视规则允许您忽略监视树中的特定文件或整个目录。
例如,在 JavaScript 项目中,忽略node_modules/
目录有两个好处:
- 表现。包含许多小文件的文件树可能会在某些配置中导致高 I/O 负载
- 多平台。如果主机操作系统或架构与容器不同,则无法共享已编译的工件
例如,在 Node.js 项目中,不建议同步目录node_modules/
。即使 JavaScript 被解释,npm
包也可能包含不可跨平台移植的本机代码。
配置
该watch
属性定义了一系列规则,用于控制基于本地文件更改的自动服务更新。
每个规则都需要一个path
模式,并action
在检测到修改时采取。有两种可能的操作,watch
并且根据action
,可能会接受或需要其他字段。
监视模式可以与许多不同的语言和框架一起使用。具体路径和规则因项目而异,但概念保持不变。
先决条件
为了正常工作,watch
依赖于常见的可执行文件。确保您的服务映像包含以下二进制文件:
- 统计数据
- 目录
- 目录
- 柏油
watch
还要求容器USER
可以写入目标路径,以便它可以更新文件。一种常见的模式是使用COPY
Dockerfile 中的指令将初始内容复制到容器中。要确保此类文件由配置的用户拥有,请使用以下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
例如,当您更新数据库配置或文件时,它会很好地工作
提示
路径和目标
该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 等)中启用热模块重新加载。web
Dockerfile
web
npm start
服务启动后,监视模式开始监视目标目录和文件。然后,每当目录中的源文件发生更改时,Compose 都会将该文件同步到容器内的web/
相应位置。/src/web
例如,./web/App.jsx
复制到/src/web/App.jsx
.
复制后,捆绑程序将更新正在运行的应用程序,而无需重新启动。
与源代码文件不同,添加新的依赖项无法即时完成,因此每当package.json
发生更改时,Compose 都会重建映像并重新创建web
服务容器。
许多语言和框架都可以遵循这种模式,例如带有 Flask 的 Python:Python 源文件可以同步,而更改requirements.txt
应该触发重建。
使用手表
- 将部分添加
watch
到 中的一项或多项服务compose.yaml
。 - 运行
docker compose watch
以构建并启动 Compose 项目并启动文件监视模式。 - 使用您喜欢的 IDE 或编辑器编辑服务源文件。
正在寻找示例项目来测试?
查看 Docker 文档
dockersamples/avatars
或 本地设置 以获取 Compose 演示。watch
反馈
我们正在积极寻找有关此功能的反馈。提供反馈或报告您在 Compose 规范存储库中可能发现的任何错误。