M1 Mac下Docker Compose watch无法热重载的问题求助
问题:M1 Mac + Docker Desktop 下
docker compose watch 无法同步 Flask 代码变更 环境:M1芯片Mac + Docker Desktop,搭建包含Flask应用的Docker环境,执行docker compose watch后修改app.py,浏览器刷新无法同步变更,需排查原因。
配置文件
app.py
import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World from Dock! I have been seen {} times.\n'.format(count)
compose.yaml
services: web: build: . ports: - "8000:5000" develop: watch: - action: sync path: . target: /code redis: image: "redis:alpine"
requirements.txt
flask redis
Dockerfile
# syntax=docker/dockerfile:1 FROM python:3.10-alpine WORKDIR /code ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD ["flask", "run", "--debug"]
排查与解决方案
1. 文件同步未触发Flask重载
你的compose.yaml用sync动作同步本地代码到容器,但Flask调试模式默认监听容器内文件的修改事件,而M1 Mac的Docker Desktop文件系统事件传递可能存在丢失,导致Flask没感知到同步后的文件变化。
解决:调整watch动作,当app.py变化时重启服务:
develop: watch: - action: sync path: . target: /code - action: restart path: app.py
或者直接用rebuild动作(适合依赖也可能变化的场景):
develop: watch: - action: rebuild path: . target: /code
2. 确认Flask调试模式配置
虽然启动命令加了--debug,但可以明确添加重载参数并设置环境变量,确保调试模式正常工作:
修改Dockerfile的启动命令:
ENV FLASK_DEBUG=1 CMD ["flask", "run", "--debug", "--reload"]
3. 检查Docker文件共享权限
在Docker Desktop设置 -> Resources -> File Sharing中,确保你的项目目录已被勾选授权,否则文件无法正常同步到容器。
4. 验证文件同步状态
执行以下命令进入web容器,检查app.py的修改时间是否和本地一致:
docker exec -it $(docker compose ps -q web) ls -l /code/app.py
如果时间不匹配,说明同步未生效,检查compose.yaml的path是否为项目根目录,路径是否正确。
5. 清理旧环境缓存
之前的镜像或容器缓存可能导致代码未更新,执行以下命令清理后重新启动:
docker compose down -v docker compose watch
内容的提问来源于stack exchange,提问作者sQuaLL
相关产品推荐
相关产品推荐

