想在容器里开发却不想反复 build?docker compose watch 可以把本地文件变化同步进容器、重启或重建。这篇用三条规则分别实测延迟和容器的变化。
docker compose up -d --build:退出码 0,用时 0.8 秒;容器 aa2394783760 docker compose watch --no-up 在后台运行(进程是否还在:True)
sync 只拷文件;sync+restart 拷完重启容器;rebuild 重新构建镜像并重建容器。路径用 develop.watch 配置。
写入后到容器里读到新内容的时间:[630, 664, 657] ms(含每次 docker exec 轮询的开销);容器还是原来的吗?True;StartedAt 变了吗?False 新增 app/new.txt:容器里 new file 删除 app/new.txt 后容器里:message.txt
改一次文件,约 0.6 秒后容器里就是新内容(这个数字包含我 docker exec 轮询的开销,实际同步更快)。删除文件也会同步到容器里。
容器里 /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,重启会快很多(没有测)。
容器被重新创建了吗?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 过来的改动也在里面。