docker下默认插件添加后无法跟随程序运行开启启动

环境

  • EMQX 版本:4.4.19
  • 操作系统版本:docker容器

重现此问题的步骤

  1. 首次docker启动将/opt/emqx/data/loaded_plugins、/opt/emqx/etc/acl/conf、/opt/emqx/etc/emqx.conf文件拷贝到宿主机
  2. 修改上边三个文件内容 如acl策略等其他配置,在loaded_plugins文件中添加mysql鉴权插件
  3. 制作dockerfile 同时将三个修改后的文件复制到docker容器中
    4.镜像制作完成,启动容器,发现emqx_auth_mysql插件没有自动启用

dockerfile文件内容:
FROM debian:11-slim

RUN set -eu;
apt-get update;
apt-get install -y --no-install-recommends curl unzip ca-certificates;
rm -rf /var/lib/apt/lists/*

RUN set -eu;
groupadd -r -g 1000 emqx;
useradd -r -m -u 1000 -g emqx emqx

ENV EMQX_VERSION=4.4.19
ENV OTP=otp24.3.4.2-1

RUN set -eu;
arch=$(dpkg --print-architecture);
if [ ${arch} = “amd64” ]; then sha256=“bf4192c64c9006733b30f96fe99506a0a3af115c7073995a044cc0e60230675e”; fi;
if [ ${arch} = “arm64” ]; then sha256=“7cd27d5112380fd4d81029b10ba862a050b0bba8af1eb90aac669189fc3053c0”; fi;
ID=“$(sed -n ‘/^ID=/p’ /etc/os-release | sed -r ‘s/ID=(.)/\1/g’ | sed ‘s/"//g’)“;
VERSION_ID=”$(sed -n ‘/^VERSION_ID=/p’ /etc/os-release | sed -r 's/VERSION_ID=(.
)/\1/g’ | sed ‘s/"//g’)”;
pkg=“emqx-${EMQX_VERSION}-${OTP}-${ID}${VERSION_ID}-${arch}.zip”;
curl -f -O -L https://www.emqx.com/en/downloads/broker/${EMQX_VERSION}/${pkg};
echo “$(sha256sum $pkg)”;
echo "$sha256 $pkg" | sha256sum -c;
unzip -q -d /opt $pkg;
chgrp -Rf emqx /opt/emqx;
chmod -Rf g+w /opt/emqx;
chown -Rf emqx /opt/emqx;
ln -s /opt/emqx/bin/
/usr/local/bin/;
rm -rf $pkg

WORKDIR /opt/emqx

USER emqx

VOLUME [“/opt/emqx/log”, “/opt/emqx/data”]

emqx will occupy these port:

- 1883 port for MQTT

- 8081 for mgmt API

- 8083 for WebSocket/HTTP

- 8084 for WSS/HTTPS

- 8883 port for MQTT(SSL)

- 11883 port for internal MQTT/TCP

- 18083 for dashboard

- 4369 epmd (Erlang-distrbution port mapper daemon) listener (deprecated)

- 4370 default Erlang distrbution port

- 5369 for gen_rpc port mapping

- 6369 6370 for distributed node

EXPOSE 1883 8081 8083 8084 8883 11883 18083 4369 4370 5369 6369 6370

COPY docker-entrypoint.sh /usr/bin/

COPY acl.conf /opt/emqx/etc
COPY emqx.conf /opt/emqx/etc
COPY loaded_plugins /var/lib/emqx/

ENTRYPOINT [“/usr/bin/docker-entrypoint.sh”]

CMD [“emqx”, “foreground”]

预期行为

docker启动指令:
emqx4]# docker run -itd --network host -p 1883:1883 -p 8081:8081 -p 8183:8083 -p 8884:8883 -p 8084:8084 -p 18083:18083 -v /etc/localtime:/etc/localtime -v /data/docker/emqx/data/mnesia:/opt/emqx/data/mnesia -e EMQX_AUTH__MYSQL__DATABASE=pksite -e EMQX_AUTH__MYSQL__SERVER=127.0.0.1:3306 -e EMQX_AUTH__MYSQL__USERNAME=root -e EMQX_AUTH__MYSQL__PASSWORD=root --name emqx emqx/emqx:test

实际行为

hi,可以尝试使用 mount 的方式将 loaded_plugins 文件挂载至 emqx 容器内部

$ cat loaded_plugins_modified  
───────┬─────────────────────────────────────
       │ File: loaded_plugins_modified
───────┼─────────────────────────────────────
   1   │ {emqx_management, true}.
   2   │ {emqx_dashboard, true}.
   3   │ {emqx_modules, false}.
   4   │ {emqx_recon, true}.
   5   │ {emqx_retainer, true}.
   6   │ {emqx_telemetry, true}.
   7   │ {emqx_rule_engine, true}.
   8   │ {emqx_bridge_mqtt, false}.
   9   │ {emqx_auth_mysql, true}.
docker run -d --name emqx-4419 --mount type=bind,source=./loaded_plugins_modified,target=/opt/emqx/data/loaded_plugins -e EMQX_AUTH__MYSQL__SERVER=172.17.0.3:3306 -e EMQX_AUTH__MYSQL__USERNAME=root -e EMQX_AUTH__MYSQL__PASSWORD=public123 emqx/emqx:4.4.19

我们生产环境是用k8s部署的集群,那么这个插件配置文件在创建pod的时候要加到数据盘上了?

原始需求就是在创建pod的时候这个mysql插件能自己也启动生效

是的,使用 k8s 部署时,也是推荐为 data 目录进行持久化的。
也可以使用 emqx-operator 对 emqx 集群进行管理。

这个是我们yaml文件一部分 就是创建了data持久化目录,但是此时目录是空的呢 没有加载mysql插件的。

等于说 每次启动一个节点,手动创建pod的时候 必须要手动到控制台去启用一下mysql插件么

这个是我的yaml一部分 生成一个持久化的存储volumeClaimTemplates:
- kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: emqx-data
creationTimestamp: null
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: csi-disk
volumeMode: Filesystem
status:
phase: Pending

原始需求就是在创建pod的时候这个mysql插件能自己也启动生效

使用环境变量 EMQX_LOADED_PLUGINS='emqx_auth_mysql' 可以在 data/loaded_plugins 启动时添加 plugin

$ docker run --name emqx-4419 --rm -it -e EMQX_LOADED_PLUGINS='emqx_auth_mysql' -e EMQX_AUTH__MYSQL__SERVER=172.17.0.3:3306 -e EMQX_AUTH__MYSQL__USERNAME=root -e EMQX_AUTH__MYSQL__PASSWORD=public123 emqx/emqx:4.4.19 -- bash
EMQX_LOADED_PLUGINS=emqx_auth_mysql
bash-5.1$ cat data/loaded_plugins 
{emqx_management, true}.
{emqx_dashboard, true}.
{emqx_modules, false}.
{emqx_recon, true}.
{emqx_retainer, true}.
{emqx_telemetry, true}.
{emqx_rule_engine, true}.
{emqx_bridge_mqtt, false}.

{emqx_auth_mysql, true}.
bash-5.1$ 

好的我试下看看


为啥我这里还是没有启用呢

我是用的4.4.19


这一行是什么意思呢

有环境变量传进去的时候会打印这一条日志,没有就是没传进去
这个是官方镜像的 entrypoint 提供的功能,不要用 zip 包自己 build 镜像

好的我再试下看看

还要请教下 就是我想修改acl.conf或者emqx.conf
里边的配置 可以通过-e来指定么

acl.conf 和 emqx.conf 不能通过环境变量指定

里边的配置是可以通过环境变量来覆盖的吧,然后就是acl_nomatch = deny和allow_anonymous = false 这两项设置成这样是不是就是覆盖了acl.conf中的{allow, all} 等同于将其变成了{deny, all}