首页 > 解决方案 > eclipse-mosquitto 中的 docker exec 错误

问题描述

eclipse-mosquitto 在 Ubuntu 上使用 Docker 安装它们。我想执行“docker exec”命令,但它给出了以下错误?你能帮我吗?

sudo docker ps

输出:

CONTAINER ID: b416d716ffd6   IMAGE: eclipse-mosquitto     COMMAND: "/docker-entrypoint.…"   CREATED: 2 days ago   STATUS: Up 44 minutes   PORTS: 0.0.0.0:9001->9001/tcp, 0.0.0.0:11883->1883/tcp   NAME: charming_bohr

命令:

sudo docker exec -it b416d716ffd6 /bin/bash

输出:OCI 运行时执行失败:执行失败:container_linux.go:370:启动容器进程导致:执行:“/bin/bash”:stat /bin/bash:没有这样的文件或目录:未知


for:自代理启动以来接收到的总字节数。

sudo docker exec -it b416d716ffd6 $SYS/broker/bytes/received

输出:

OCI runtime exec failed: exec failed: container_linux.go:370: starting container process caused: exec: "/broker/bytes/received": stat /broker/bytes/received: no such file or directory: unknown

标签: eclipsedocker

解决方案


有两个明显的问题。

  1. eclipse mosquitto 图像不包含 bash,因此您需要使用不同的 shell,例如 sh

    `sudo docker exec -it b416d716ffd6 /bin/sh

  2. $SYS/broker/bytes/received是一个由 mosquitto 在内部自动管理的特殊主题,您可以“从外部”访问它,而无需在正在运行的容器中执行任何操作,例如,您可以使用 mosquitto sub(sudo apt-get install -y mosquitto_clients如果您还没有它)

    mosquitto_sub -t '$SYS/broker/bytes/received'

-h如果 mosquitto 不在本地主机上,-p如果它不在默认端口上,-d如果您希望它更详细等等,则添加选项。

作为参考,在mosquitto 手册页中清楚地解释了 MQTT 客户端的这种需求:

代理状态 客户端可以通过订阅 $SYS 层次结构中的主题来查找有关代理的信息,如下所示。标记为静态的主题仅在订阅时每个客户端发送一次。所有其他主题每 sys_interval 秒更新一次。如果 sys_interval 为 0,则不发送更新。

请注意,如果您使用命令行客户端与 $SYS 主题交互并且您的 shell 将 $ 解释为环境变量,则需要将主题放在单引号 '$SYS/...' 中或转义美元符号: $SYS/... 否则 $SYS 将被视为环境变量。

$SYS/broker/bytes/received 自代理启动以来收到的总字节数。


推荐阅读