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

PyP100控制Tapo智能插排:docker run正常但Compose启动失败

Docker Compose启动PyP100应用时握手失败,docker run正常

问题详情

使用PyP100(almottier分支)开发的Python应用控制TP-Link Tapo智能插排,通过docker run启动容器时能正常与插排握手并控制开关,但使用Docker Compose启动同一镜像时,出现协议初始化失败的报错:

Traceback (most recent call last):
  File "/app/src/host_commands.py", line 24, in turn_on
    plug.turnOff()
  File "/usr/local/lib/python3.12/site-packages/PyP100/PyP100.py", line 98, in turnOff
    return self.set_status(False)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/PyP100/PyP100.py", line 92, in set_status
    return self._set_device_info({"device_on": status})
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/PyP100/PyP100.py", line 64, in _set_device_info
    return self.request("set_device_info", params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/PyP100/PyP100.py", line 46, in request
    self._initialize()
  File "/usr/local/lib/python3.12/site-packages/PyP100/PyP100.py", line 42, in _initialize
    raise Exception("Failed to initialize protocol")
Exception: Failed to initialize protocol

可用的docker run命令

docker run --rm \
  --env-file .env \
  --volume "$(pwd)/logs:/app/logs" \
  --volume "$(pwd)/scripts:/app/scripts" \
  --network host \
  --privileged \
  --cap-add NET_ADMIN \
  --cap-add NET_RAW \
  tapo:1.0

Docker Compose配置

services:
  tapo-backup:
    image: tapo:1.0
    env_file:
      - .env
    volumes:
      - ./logs:/app/logs
      - ./scripts:/app/scripts
    network_mode: host
    restart: on-failure
    privileged: true              
    cap_add:
      - NET_ADMIN
      - NET_RAW

.env文件内容

# MAC Addresses
PLUG_MAC=MAC_ADDRESS1
REMOTE_HOST_MAC=MAC_ADDRESS2

# TAPO Credentials
EMAIL=myemail@gmail.com
PASSWORD=password

# borgbackup
BORG_PASSPHRASE=XYZl0ngandsecurepa_55_phrasea&&123
BORG_REPOS_PATH=/path/to/repos

# Others
SSH_USERNAME=username
SUBNET=192.168.1.0/24
TZ=Europe/Berlin

预期docker run与Docker Compose提供一致的运行环境,使PyP100在Compose下正常运行。


可能的解决方法

1. 验证环境变量加载

Docker Compose的env_file默认从执行命令的当前目录加载,若你在子目录执行docker compose,可能找不到.env文件。可以显式指定文件绝对路径:

env_file:
  - /full/path/to/your/.env

2. 确认host网络生效

执行docker inspect tapo-backup查看容器的NetworkSettings,确认NetworkMode为host。若未生效,检查宿主机是否开启了Docker的host网络支持(部分Linux发行版或云环境可能有限制)。

3. 调整容器启动时机

PyP100握手需要网络完全就绪,Compose可能在网络未初始化完成时启动应用。可以添加延迟启动或健康检查:

services:
  tapo-backup:
    # ... 现有配置
    healthcheck:
      test: ["CMD", "ping", "-c", "1", "192.168.1.1"] # 替换为你的网关或插排IP
      interval: 5s
      timeout: 5s
      retries: 3
    command: ["sh", "-c", "sleep 10 && python /app/src/main.py"] # 延迟10秒启动应用

4. 优化权限配置

privileged: true已经包含所有权限,可能和cap_add存在冗余冲突,尝试移除privileged: true,仅保留cap_add:

privileged: false              
cap_add:
  - NET_ADMIN
  - NET_RAW

同时确认容器以root用户运行,可添加user: root配置。

5. 检查镜像一致性

执行docker images tapo:1.0查看镜像ID,确保docker run和Compose使用的是同一镜像。若存在构建步骤,确认Compose没有自动重新构建差异镜像。


内容的提问来源于stack exchange,提问作者CariP03

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:58:08