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
相关产品推荐
相关产品推荐

