You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:33:32