docker - 如何在 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@0eceaaa217c8
,rabbit@ac5afbef3c81
我得到一个常量字符串.pid
和mnesia目录,但是 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
解决方案
在rabbitmq
Docker 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:
设置的是容器认为它自己的主机名是什么。它与网络设置完全没有连接。通常不需要设置它,除非你有这样的软件专门查看它。)
推荐阅读
- visual-studio-code - IntelliSense 只建议一个选项
- python - Python解析器不能与代理一起工作我该怎么办?
- excel - 自动更新数据透视表-EXCEL
- excel - Excel VBA 从 Web 提取 HTML 数据时对象未设置错误
- java - 使用 CMD 的 java RMI 的端口已在使用异常
- python-sphinx - 如何在 Sphinx 主题中设置布局切换到移动布局的宽度阅读文档?
- elasticsearch - Elasticsearch 本地实例
- mysql - 在 Mysql 中过滤值和求和
- javascript - Gatsby StaticQuery 和呈现的 HTML
- redis - 无法连接到在不同网络命名空间中运行的 redis 服务器