EMQX 容器持久化需要将以下目录挂载处理:

  • /opt/emqx/data
  • /opt/emqx/etc
  • /opt/emqx/lib
  • /opt/emqx/log

假设为 EMQX 配置 compose 编排:

version: "3.7"
services:
  emqx:
    image: emqx/emqx
    restart: always
    environment:
      EMQX_NAME: emqx
      EMQX_HOST: 127.0.0.1
      EMQX_ALLOW_ANONYMOUS: "false"
      EMQX_LISTENER__TCP__EXTERNAL: 1883
      EMQX_LISTENER__WS__EXTERNAL: 8083
      EMQX_DASHBOARD__DEFAULT_USER__LOGIN: root
      EMQX_DASHBOARD__DEFAULT_USER__PASSWORD: 123456
    ports:
      - 1883:1883
      - 8083:8083
      - 8081:8081
    volumes:
      - ./emqx/lib:/opt/emqx/lib
      - ./emqx/etc:/opt/emqx/etc
      - ./emqx/data:/opt/emqx/data
      - ./emqx/log:/opt/emqx/log

此时,编排的容器不能成功运行,并提示:

emqx_1             | cat: can't open '/opt/emqx/etc/emqx.conf': No such file or directory
emqx_1             | ls: /opt/emqx/etc/plugins: No such file or directory

因此我们要让容器正常的运行起来,首先要屏蔽挂载配置,重新编排

version: "3.7"
services:
  emqx:
    image: emqx/emqx
    restart: always
    environment:
      EMQX_NAME: emqx
      EMQX_HOST: 127.0.0.1
      EMQX_ALLOW_ANONYMOUS: "false"
      EMQX_LISTENER__TCP__EXTERNAL: 1883
      EMQX_LISTENER__WS__EXTERNAL: 8083
      EMQX_DASHBOARD__DEFAULT_USER__LOGIN: root
      EMQX_DASHBOARD__DEFAULT_USER__PASSWORD: 123456
    ports:
      - 1883:1883
      - 8083:8083
      - 8081:8081
    # volumes:
    #   - ./emqx/lib:/opt/emqx/lib
    #   - ./emqx/etc:/opt/emqx/etc
    #   - ./emqx/data:/opt/emqx/data
    #   - ./emqx/log:/opt/emqx/log

将文件从容器中复制出来,$CONTAINER 换成该容器的 ID:

docker cp $CONTAINER:/opt/emqx/data ./emqx/
docker cp $CONTAINER:/opt/emqx/etc ./emqx/
docker cp $CONTAINER:/opt/emqx/lib ./emqx/
docker cp $CONTAINER:/opt/emqx/log ./emqx/

为其设置权限,需要对应的用户 ID 为 1000

chown -R kain:kain ./emqx
chmod -R 755 ./emqx

解除屏蔽的挂载配置,重新编排

emqx_1             | EMQ X Broker 4.1.4 is running now!

经测试,为 EMQX 增加配置后,删除容器再重新创建持久化生效,容器运行正常