首页 > 解决方案 > 如何在 Docker 中保留 RabbitMQ 用户帐户

问题描述

我无法持久化通过管理面板设置的 dockerized RabbitMQ 用户帐户。重新启动后它们消失了,我相信这与每次重新启动时创建的新mnesia数据库有关。

我尝试将 docker 卷绑定到/var/lib/rabbitmq

version: '3.1'

services:

  rabbitmq:
    image: rabbitmq:management-alpine
    volumes:
      - rabbitdata1:/var/lib/rabbitmq/
    ports:
      - "5672:5672"
      - "15672:15672"

volumes:
  rabbitdata1:
    driver: local

当我查看挂载目录的内容时,我得到:

$ docker exec -ti local_rabbitmq_1 /bin/bash
bash-5.0# ls /var/lib/rabbitmq/mnesia/
rabbit@0eceaaa217c8                 rabbit@0eceaaa217c8-plugins-expand
rabbit@0eceaaa217c8-feature_flags   rabbit@0eceaaa217c8.pid

但是当我重新启动服务时,似乎为新 PID 创建了一个新实例,并且所有更改都丢失了:

$ docker exec -ti local_rabbitmq_1 /bin/bash
bash-5.0# ls /var/lib/rabbitmq/mnesia/
rabbit@0eceaaa217c8                 rabbit@ac5afbef3c81
rabbit@0eceaaa217c8-feature_flags   rabbit@ac5afbef3c81-feature_flags
rabbit@0eceaaa217c8-plugins-expand  rabbit@ac5afbef3c81-plugins-expand
rabbit@0eceaaa217c8.pid             rabbit@ac5afbef3c81.pid

我还尝试设置RABBITMQ_NODENAME环境变量,而不是上面的rabbit@0eceaaa217c8rabbit@ac5afbef3c81我得到一个常量字符串.pidmnesia目录,但是 RabbitMQ 甚至不会重新启动:

2020-04-10 10:41:34.657 [info] <0.309.0> Running boot step database defined by app rabbit
2020-04-10 10:41:34.685 [error] <0.308.0> CRASH REPORT Process <0.308.0> with 0 neighbours exited with reason: {{failed_to_cluster_with,[foo@190e6343c238],"Mnesia could not connect to any nodes."},{rabbit,start,[normal,[]]}} in application_master:init/4 line 138
2020-04-10 10:41:34.686 [info] <0.44.0> Application rabbit exited with reason: {{failed_to_cluster_with,[foo@190e6343c238],"Mnesia could not connect to any nodes."},{rabbit,start,[normal,[]]}}
{"Kernel pid terminated",application_controller,"{application_start_failure,rabbit,{{failed_to_cluster_with,[foo@190e6343c238],\"Mnesia could not connect to any nodes.\"},{rabbit,start,[normal,[]]}}}"}
Kernel pid terminated (application_controller) ({application_start_failure,rabbit,{{failed_to_cluster_with,[foo@190e6343c238],"Mnesia could not connect to any nodes."},{rabbit,start,[normal,[]]}}})

有没有其他方法可以保留 RabbitMQ docker 服务重新启动之间的更改?

也许还有其他目录可以解决问题?

我检查了其他潜在的候选者,但只找到了它们/etc/rabbitmq//opt/rabbitmq/它们分别看起来像配置和安装目录:

bash-5.0# find . -name 'rabbitmq'
./etc/rabbitmq
./var/log/rabbitmq
./var/lib/rabbitmq
./opt/rabbitmq
./opt/rabbitmq/etc/rabbitmq

标签: dockerrabbitmq

解决方案


rabbitmqDocker Hub 映像的文档中它指出(在“运行守护程序”下):

关于 RabbitMQ 需要注意的重要一点是,它基于所谓的“节点名称”存储数据,默认为主机名。这对于 Docker 的使用意味着我们应该为每个守护进程明确指定-h/ --hostname,这样我们就不会得到一个随机的主机名并且可以跟踪我们的数据。

等效的 Docker Compose 设置是hostname:. 它默认为容器 ID,每次重新创建容器时都会更改,这就是为什么您看不到数据持久化以及文件名在其名称中具有 12 位十六进制数字 ID 的原因。

services:
  rabbitmq:
    image: rabbitmq:management-alpine
    hostname: rabbitmq                 # <-----
    volumes:
      - rabbitdata1:/var/lib/rabbitmq/
    ports:
      - "5672:5672"
      - "15672:15672"

(唯一hostname:设置的是容器认为它自己的主机名是什么。它与网络设置完全没有连接。通常不需要设置它,除非你有这样的软件专门查看它。)


推荐阅读