TL;DR
容器内的 RabbitMQ 实例在不同的地方寻找数据。默认配置会更改每个容器创建的数据存储/加载位置。因此,OPs 数据存在于创建的“最终”image 中,但 rabbitmq 没有加载它。
修复静态设置RABBITMQ_NODENAME,这同样可能需要在/etc/hosts 中添加另一行,以便 RabbitMQ 确认节点处于活动状态。
详情
这发生在我的 docker rabbit:3.8.12-management
这是由 RabbitMQ 的默认配置影响其数据存储方式造成的。默认情况下,RabbitMQ 在 UNIX 系统上启动一个名为 rabbit@$HOSTNAME 的节点(参见 config docs 上的 RABBITMQ_NODENAME)。在 Docker 中,每个容器运行的 $HOSTNAME 更改默认为 container id(例如 dd84759287560 之类的东西)。
在@jhilden 的情况下,当vbrabbit:withVhostAndQueues 映像作为新容器启动时,RABBITMQ_NODENAME 与用于创建和存储原始虚拟主机、用户、队列等的值不同。并且作为 RabbitMQ 存储以RABBITMQ_NODENAME 命名的目录中的数据现有数据不会在vbrabbit:withVhostAndQueues 启动时加载。当$HOSTNAME 改变时RABBITMQ_NODENAME 改变。因此,启动的 RabbitMQ 实例找不到任何现有数据。 (例如,现有数据存在于图像中,但用于不同的 RABBITMQ_NODENAME 并且未加载)。
注意:我只考虑为本地开发单实例集群解决此问题。如果您使用 RabbitMQ docker 进行生产部署,您可能需要查看自定义主机名
为了解决这个问题,我们为容器设置了一个静态 RABBITMQ_NODENAME。
在我们更新的 docker-compose v3 文件中:
# Before fix
rabbitmq:
image: "rabbitmq:$RABBITMQ_VERSION"
container_name: rabbitmq
ports:
- "5672:5672"
- "15672:15672"
- "61613:61613"
volumes:
- "./etc/rabbit-plugins:/etc/rabbitmq/enabled_plugins"
- type: volume
source: rabbitmq-data
target: /var/lib/rabbitmq
修复后进入:
rabbitmq:
image: "rabbitmq:$RABBITMQ_VERSION"
container_name: rabbitmq
# Why do we set NODENAME and extra_hosts?
#
# It codifies that we're using the same RabbitMQ instance between container rebuilds.
# If NODENAME is not set it defaults to "rabbit@$HOST" and because $HOST is dynamically
# created in docker it changes per container deployment. Why is a changing host an issue?
# Well because under the hood Rabbit stores data on a per node basis. Thus without the
# static RABBITMQ_NODENAME the directory the data is stored within changes per restart.
# Going from "rabbit@7745942c559e" to "rabbit@036834720485" the next. Okay, but why do we
# need extra_hosts? We'll Rabbit wants to resolve itself to affirm it's management UI is
# functioning post deployment and does that with an HTTP call. Thus to resolve the static
# host from RABBITMQ_NODENAME we need to add it to the containers /etc/hosts file.
environment:
RABBITMQ_NODENAME: "rabbit@staticrabbit"
extra_hosts:
- "staticrabbit:127.0.0.1"
ports:
- "5672:5672"
- "15672:15672"
- "61613:61613"
volumes:
- "./etc/rabbit-plugins:/etc/rabbitmq/enabled_plugins"
- type: volume
source: rabbitmq-data
target: /var/lib/rabbitmq