docker 中的 mqtt 服务器 - 从 DockerCompose.yaml 运行 <mosquitto_passwd -U> 的方法

Jéa*_*éan 5 mqtt docker

终于在 Docker 中运行了 mqtt,但我想使用 uid/pwd。通过以下方式让一切正常工作:

  1. 第一次使用不要求 passwd 文件的 mosquitto.conf 文件,
  2. 通过来自 3. 创建的 mqtt 映像的 DockerCompose.yaml 启动 mqtt 服务,
  3. 然后使用登录到服务docker exec -it containerid sh
  4. 然后,我在服务中运行命令mosquitto_passwd -U passwdfile来加密文件中的打开密码;
  5. 然后我停止 docker 服务的堆栈,更改密码文件位置的 mosquitto.conf,再次 stsrtup 堆栈和服务,然后它就可以工作了。

如果我不这样做,mqtt 容器将退出,并表示 passwd 文件未正确加密。

那么,他们是否可以在 mqtt 服务器期望之前在 docker 容器中运行加密命令?

lar*_*sks 6

您可以使用脚本在启动服务之前ENTRYPOINT运行。使用如下 Dockerfile:mosquitto_passwdmosquitto

FROM eclipse-mosquitto

COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["sh", "/entrypoint.sh"]
CMD ["/usr/sbin/mosquitto","-c","/mosquitto/config/mosquitto.conf"]
Run Code Online (Sandbox Code Playgroud)

和一个entrypoint.sh看起来像这样的脚本:

#!/bin/sh

PASSWDFILE=/etc/mosquitto/passwd

if [ -f $PASSWDFILE ]; then
    echo "converting password file"
    mosquitto_passwd -U $PASSWDFILE
fi

exec "$@"
Run Code Online (Sandbox Code Playgroud)

当您从此映像启动容器时,它将mosquitto_passwd在启动mosquitto服务之前运行。

此示例存在一些问题:特别是,由于mosquitto_passwd就地修改了文件,因此您需要确保不会尝试转换已转换的文件。

希望这能为您提供一些关于如何构建更完整的解决方案的想法。


Chr*_*oph 6

mosquito_passwd另一种选择是在容器内部运行,即在容器外壳上运行。这是对我有用的方法(请注意,我将配置目录保留在容器外部):

  1. mosquitto_passwords在配置目录中创建您的文件

  2. 进入容器

$ docker exec -it mosquitto sh
Run Code Online (Sandbox Code Playgroud)

mosquitto灭蚊容器的名称在哪里)

  1. 导航到您的密码文件
/ $ cd mosquitto/
/mosquitto $ ls
config  data    log
/mosquitto $ cd config/
/mosquitto/config $ ls
mosquitto.conf       mosquitto_passwords
Run Code Online (Sandbox Code Playgroud)
  1. 运行 mosquitto_passwd 来哈希您的密码文件
/mosquitto/config $ mosquitto_passwd -U mosquitto_passwords
Run Code Online (Sandbox Code Playgroud)

如果您收到类似错误

Error: Unable to open password file /mosquitto/config/mosquitto_passwords. Permission denied.
Run Code Online (Sandbox Code Playgroud)

您需要确保容器用户可以访问您的密码文件和配置目录。找出哪个用户正在执行此操作

/mosquitto/config $ whoami
whoami: unknown uid 1000
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下你可以这样做

$ sudo chown 1000 config
$ sudo chown 1000 config/mosquitto_passwords
Run Code Online (Sandbox Code Playgroud)

在那之后,

/mosquitto/config $ mosquitto_passwd -U mosquitto_passwords
Run Code Online (Sandbox Code Playgroud)

应该可以正常工作,你就完成了。

  1. 退出容器
/mosquitto/config $ exit
Run Code Online (Sandbox Code Playgroud)

不要忘记将您的mosquitto.conf密码指向您的新密码文件。