docker 中的 RabbitMQ 在删除没有卷的容器后丢失数据。
我的 Dockerfile:
FROM rabbitmq:3-management
ENV RABBITMQ_HIPE_COMPILE 1
ENV RABBITMQ_ERLANG_COOKIE "123456"
ENV RABBITMQ_DEFAULT_VHOST "123456"
我的运行脚本:
IMAGE_NAME="service-rabbitmq"
TAG="${REGISTRY_ADDRESS}/${IMAGE_NAME}:${VERSION}"
echo $TAG
docker rm -f $IMAGE_NAME
docker run \
-itd \
-v "rabbitmq_log:/var/log/rabbitmq" \
-v "rabbitmq_data:/var/lib/rabbitmq" \
--name "service-rabbitmq" \
--dns=8.8.8.8 \
-p 8080:15672 \
$TAG
移除容器后,所有数据都会丢失。
如何在 docker 中配置具有持久数据的 RabbitMQ?
没有对此进行太多的挖掘,但似乎最简单的方法是更改 hostname
,正如 Pedro 上面提到的那样。
RABBITMQ_NODENAME
RABBITMQ_NODENAME
变量,看起来您还需要添加
hostname
,因为 Docker 主机名是作为随机哈希生成的。如果将 RABBITMQ_NODENAME
变量更改为
my-rabbit
之类的静态内容,RabbitMQ 将抛出类似 "nxdomain not found"
错误的内容,因为它正在寻找类似 my-rabbit@<docker_hostname_hash>
如果您知道 Docker 主机名并且可以像这样自动将其拉入您的
RABBITMQ_NODENAME
my-rabbit@<docker_hostname_hash>
我相信它会起作用。
我之前说过,
如果您知道 Docker 主机名并且可以像这样自动将其拉入您的
RABBITMQ_NODENAME
值中,
我相信它会起作用。 这不会像所描述的那样工作,因为如果没有显式分配,默认的 docker 主机名是在启动时随机生成的。实际上,障碍是确保您使用与原始运行完全相同的my-rabbit@<docker_hostname_hash>
<docker_hostname_hash>
,以便正确拾取数据目录。动态/稳健地实现这将是一件痛苦的事情。使用显式主机名是最简单的,如下所述。
另一种方法是将hostname
设置为您选择的值 - 例如,
app-messaging
- 并且还将
RABBITMQ_NODENAME
var 设置为 rabbit@app-messaging
之类的值。这样您就可以控制将在数据目录中使用的完整节点名称。使用主机名
) 也就是说,除非您有理由
不更改主机名,否则单独更改主机名是确保每次将数据挂载到同一点或从同一点挂载的最简单方法。 我正在使用以下 Docker Compose 文件在启动之间成功保留我的设置。
version: '3'
services:
rabbitmq:
hostname: 'mabbit'
image: "${ARTIFACTORY}/rabbitmq:3-management"
ports:
- "15672:15672"
- "5672:5672"
volumes:
- "./data:/var/lib/rabbitmq/mnesia/"
networks:
- rabbitmq
networks:
rabbitmq:
driver: bridge
这会在我的撰写文件旁边创建一个
data
目录,并保留 RabbitMQ 设置,如下所示:
./data/
rabbit@mabbit/
rabbit@mabbit-plugins-expand/
[email protected]
rabbit@mabbit-feature_flags
解决方案是设置环境 RABBITMQ_NODENAME=rabbit@my-rabbit 并添加 my-rabbit=127.0.0.1 作为额外的主机文件条目