Docker Compose Watch执行`up --watch`重启容器时报context canceled错误但`docker compose watch`正常的问题求助
Docker Compose Watch执行
up --watch重启容器时报context canceled错误但docker compose watch正常的问题求助 大家好,我最近在开发一个Go应用,想通过Docker Compose Watch实现热重载来提升开发效率。之前在其他项目里用这套流程都很顺畅,但这个项目里碰到了一个诡异的问题:
问题现象
- 当我执行
docker compose up --watch时,修改代码触发文件变更后,容器确实会重启(从docker compose logs里能看到main函数的打印信息出现了两次),但Watch进程会直接报下面的错误然后退出:
WARN[0012] Error handling changed files: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.51/containers/32fa54d8e4c772c25479d78e1e09f66c88af18f590bea73f7b12dbd5ae7bd261/restart": context canceled
- 但如果我直接执行
docker compose watch,文件变更后容器能正常重启,完全不会出现上面的错误,日志也能正常看到两次打印。 - 这个问题只在当前项目出现,我其他用同样热重载策略的Go项目完全没这个问题。而且我在工作笔记本上跑这个项目的代码,
up --watch也能正常工作,只有我本地机器会报错。
排查过的尝试
- 网上看到说
context canceled可能是因为监听的文件数量太多,但这个项目的文件量比我其他正常工作的项目还少,而且我还加了.dockerignore忽略了.git目录,问题依然存在。 - 试过修改挂载方式:从把本地代码挂载到容器里+restart的方式,改成其他同步策略,结果还是一样的错误。
- 用
docker compose watch命令完全正常,说明Watch的逻辑本身是通的,只是up --watch的组合出了问题?
相关代码文件
main.go
package main import ( "fmt" "time" ) func main() { fmt.Println("turtle5") for { time.Sleep(10) } }
Dockerfile
FROM golang:alpine3.22 AS builder WORKDIR /app COPY . /app/ RUN go mod download; RUN go build -o turtle FROM alpine:latest AS runner WORKDIR /app COPY --from=builder /app/turtle /app/ CMD ["./turtle"]
docker-compose.yaml
services: turtle: build: context: . dockerfile: Dockerfile
docker-compose.override.yaml
services: turtle: build: context: ./ target: builder volumes: - ./:/app command: - go - run - main.go develop: watch: - path: . action: restart
环境版本
- Docker版本:28.3.3
- Docker Compose版本:2.39.1
有没有大佬遇到过类似的情况?或者能帮我分析下为什么docker compose up --watch和docker compose watch的表现会不一致,以及怎么解决这个context canceled导致Watch退出的问题?
内容来源于stack exchange
相关产品推荐
相关产品推荐

