这套方案在 Mac Studio 的 Docker Desktop 上独立运行 ESPHome,用于编译固件和管理设备。
核心优势:
ESPHome Dashboard独立可用,出问题容易定位- 设备直接拉项目 API,不依赖外部服务
这套方案适合:
- 在 Mac 上稳定编译 ESPHome
- 打开本地 ESPHome Dashboard
- 生成
factory固件 - 首次通过浏览器/USB 给
reTerminal E1001刷机 - 后续通过 OTA 更新到业务面板
这套方案不做的事:
- 不用 Docker 直接接管 USB 首刷
原因是 Docker Desktop on macOS 不适合把宿主 USB 设备直接透传进 ESPHome 容器。当前推荐做法是:
- 用 Docker 里的 ESPHome 编译固件
- 从 Dashboard 手动下载
factory固件 - 用浏览器 Web Serial 或其它宿主侧 USB 工具刷到设备
这和 ESPHome 官方在 macOS 下对 Docker 的使用方式是一致的。
当前仓库已经整理成下面这套结构:
/Users/cyan/code/collect-server/
├── Makefile
├── deploy/
│ └── esphome/
│ ├── docker/
│ │ ├── compose.yaml
│ │ └── .env.example
│ ├── secrets.example.yaml
│ ├── reterminal_e1001_first_flash_alt.yaml
│ ├── reterminal_e1001_infohub_api.yaml
│ └── reterminal_e1001_partial_refresh_probe.yaml
└── docs/
├── infohub-eink-first-flash-runbook.md
└── infohub-eink-direct-api-panel.md
其中:
- compose.yaml 负责启动本地
ESPHome Dashboard - secrets.example.yaml 是设备侧 secrets 模板
- reterminal_e1001_first_flash_alt.yaml 首刷配置(
7.50inv2alt,已验证可亮屏) - reterminal_e1001_infohub_api.yaml 业务面板(
7.50inV2p,支持局部刷新) - reterminal_e1001_partial_refresh_probe.yaml 局部刷新探针(已验证通过)
注意:
/config映射到仓库里的deploy/esphomePlatformIO包缓存走容器卷/cache- 编译产物走容器卷
/build
这样可以避开 OrbStack/macOS 共享目录在处理 ESP-IDF 大量文件时的复制失败问题。
在仓库根目录执行:
cd /Users/cyan/code/collect-server
cp deploy/esphome/secrets.example.yaml deploy/esphome/secrets.yaml
cp deploy/esphome/docker/.env.example deploy/esphome/docker/.env然后编辑:
deploy/esphome/secrets.yamldeploy/esphome/docker/.env
最少需要改的内容:
# deploy/esphome/secrets.yaml
wifi_ssid: "你的 2.4G Wi-Fi"
wifi_password: "你的 Wi-Fi 密码"
wifi_fallback_password: "建议单独设一个"
esphome_api_encryption_key: "openssl rand -base64 32 生成"
esphome_ota_password: "openssl rand -hex 16 生成"如果你还没有 key/password:
openssl rand -base64 32
openssl rand -hex 16下面这些命令都可以直接在仓库根目录执行:
如果你使用的是 OrbStack,建议在命令前显式加上:
DOCKER_CONTEXT=orbstack例如:
cd /Users/cyan/code/collect-server
make DOCKER_CONTEXT=orbstack esphome-upcd /Users/cyan/code/collect-server
make DOCKER_CONTEXT=orbstack esphome-configcd /Users/cyan/code/collect-server
make DOCKER_CONTEXT=orbstack esphome-pullcd /Users/cyan/code/collect-server
make DOCKER_CONTEXT=orbstack esphome-up启动后,本地地址默认是:
http://localhost:6052
cd /Users/cyan/code/collect-server
make DOCKER_CONTEXT=orbstack esphome-logscd /Users/cyan/code/collect-server
make DOCKER_CONTEXT=orbstack esphome-pscd /Users/cyan/code/collect-server
make DOCKER_CONTEXT=orbstack esphome-downcd /Users/cyan/code/collect-server
make DOCKER_CONTEXT=orbstack esphome-recreate这是当前最稳妥的主路径。
- 运行:
cd /Users/cyan/code/collect-server
make DOCKER_CONTEXT=orbstack esphome-up- 打开:
http://localhost:6052
- 在 Dashboard 里导入或编辑:
- 当前这台设备优先使用 reterminal_e1001_first_flash_alt.yaml
- 选择手动下载
factory固件 - 用浏览器 Web Serial 或宿主机 USB 工具完成第一次刷机
- 屏幕显示
ALT PROFILE后,再切到:
如果你想先排除 YAML/字体/依赖问题,可以先只跑编译:
cd /Users/cyan/code/collect-server
make DOCKER_CONTEXT=orbstack esphome-compile-stage1-altStage 2 业务面板编译:
cd /Users/cyan/code/collect-server
make DOCKER_CONTEXT=orbstack esphome-compile-stage2CLI 编译会直接在已经运行的 infohub-esphome 容器里执行,并显式复用镜像里的 /entrypoint.sh。
这样可以避免多个容器并发写同一套 PlatformIO 缓存时出现包状态损坏。
同时也能确保 /cache 和 /build 这些容器卷配置在 CLI 编译时同样生效。
- 准备
deploy/esphome/secrets.yaml - 执行
make DOCKER_CONTEXT=orbstack esphome-up - 打开
http://localhost:6052 - 用 reterminal_e1001_first_flash_alt.yaml 生成
factory固件 - 第一次通过浏览器/USB 刷进设备
- 确认屏幕出现
ALT PROFILE
- 在
deploy/esphome/secrets.yaml里补上:
infohub_eink_device_url: "http://10.30.5.172:8080/dashboard/eink/device.json?token=YOUR_DASHBOARD_TOKEN&refresh=300"- 把设备切到 reterminal_e1001_infohub_api.yaml
- 通过 OTA 更新
- 验证只有 JSON 变化时才刷新
ESPHome 官方文档专门提到 Docker on Mac 应该打开这个选项,这样 Dashboard 的设备在线检查更稳。
ESPHome 官方镜像的 entrypoint.sh 会在检测到 /cache 和 /build 挂载时:
- 把
PlatformIO的平台/包/缓存放到/cache - 把编译输出放到
/build
这对 OrbStack/macOS 很重要,因为 ESP-IDF 安装过程中包含大量文件复制。把这些高频 I/O 从共享目录 /config 挪开后,稳定性会明显更好。
因为你现在在 macOS 上跑的是 Docker Desktop,这一层本身就带了 Linux 虚拟化。把 USB 稳定透传到 ESPHome 容器里并不是这条路线的强项。
当前更稳的组合是:
- Docker 负责编译和 Dashboard
- 浏览器/宿主机负责第一次 USB 刷机
- 设备上线后改走 OTA
如果字体下载、依赖下载慢,可以在:
对应复制出的 .env 里设置:
HTTP_PROXY=http://10.30.5.172:7897
HTTPS_PROXY=http://10.30.5.172:7897
NO_PROXY=localhost,127.0.0.1,10.30.5.0/24容器启动时会自动继承进去。
- Compose 文件:compose.yaml
- Docker 环境变量示例:.env.example
- 首刷 runbook:infohub-eink-first-flash-runbook.md
- API 直连方案:infohub-eink-direct-api-panel.md
- ESPHome 官方命令行与 Docker 指南: Getting Started with the Command Line and Docker