bigywater.tech
Docker · 69

Compose watch:sync、rebuild 的触发规则

想在容器里开发却不想反复 build?docker compose watch 可以把本地文件变化同步进容器、重启或重建。这篇用三条规则分别实测延迟和容器的变化。

约 0.6 秒
sync 规则下,本地改文件到容器里读到新内容的时间
同一个容器、重启
sync+restart:StartedAt 变了而容器 ID 不变
约 6.2 秒
rebuild 规则下,改文件到新容器可用的时间

三种动作

实测 · 本机执行输出
  docker compose up -d --build:退出码 0,用时 0.8 秒;容器 aa2394783760
  docker compose watch --no-up 在后台运行(进程是否还在:True)

sync 只拷文件;sync+restart 拷完重启容器;rebuild 重新构建镜像并重建容器。路径用 develop.watch 配置。

sync 的延迟

实测 · 本机执行输出
  写入后到容器里读到新内容的时间:[630, 664, 657] ms(含每次 docker exec 轮询的开销);容器还是原来的吗?True;StartedAt 变了吗?False
  新增 app/new.txt:容器里 new file
  删除 app/new.txt 后容器里:message.txt

改一次文件,约 0.6 秒后容器里就是新内容(这个数字包含我 docker exec 轮询的开销,实际同步更快)。删除文件也会同步到容器里。

sync+restart

实测 · 本机执行输出
  容器里 /conf.txt = c2(约 662 ms 后读到);容器还是原来的?True;StartedAt 变了吗?True(约 3.8 秒后看到重启)
  这段时间容器的事件(去掉 exec_*):extract-to-dir → kill → kill → stop → die → start → restart

容器 ID 不变,但 StartedAt 变了:先 kill、stop、die,再 start。耗时里的大头是等 sh 作为 PID 1 退出(见 c30 的默认宽限期),如果你的程序能处理 SIGTERM,重启会快很多(没有测)。

rebuild

实测 · 本机执行输出
  容器被重新创建了吗?True;耗时约 6.2 秒;新容器里 /deps.txt = d2;/app/message.txt = v4
  watch 进程输出里的不同行:Watch enabled | Syncing service "web" after 1 changes were detected | Container bwlab-c64-web-1 Restarting | Container bwlab-c64-web-1 Started | service(s) ["web"] restarted | Rebuilding service(s) ["web"] after changes were detected... | Image bwlab-c64-web Building | #1 [internal] load local bake definitions | #1 reading from stdin 532B done | #1 DONE 0.0s | #2 [internal] load build definition from Dockerfile | #2 

重新构建会触发整个构建流程(这个镜像很小,所以只要几秒)。新容器是用最新的整个目录构建出来的,所以前面 sync 过来的改动也在里面。

分步演示

compose watch
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。Docker Compose v5.5.1;镜像是 alpine:3.20 加几个 COPY(构建不需要联网);用 docker compose watch --no-up 在后台运行,从 Python 里写文件并轮询 docker exec cat 计时;容器事件取自 docker events;实验后已停止 watch 并 down -v
    • 没有验证:ignore 规则、initial_sync、大目录的监视开销、Linux 上的文件监视行为、真实框架(如 Node、Flask)的热重载、sync 的权限与属主、docker compose up --watch
    京ICP备2026067502号-1京公网安备11010502063487号