将代理定义导入Dockerized RabbitMQ

bbuxkriu  于 2023-04-20  发布在  RabbitMQ
关注(0)|答案(7)|浏览(118)

我有一个RabbitMQ代理,已经定义了一些交换和队列。我知道我可以通过HTTP API导出和导入这些定义。我想将其Dockerize,并在启动时导入所有代理定义。
理想情况下,它可以像通过API一样轻松完成。我可以编写一堆rabbitmqctl命令,但由于定义很多,这可能需要相当长的时间。此外,其他人通过Web界面进行的每个更改都必须插入。
我写了一个脚本来休眠curl请求并启动服务器,但这似乎容易出错,而且真的不优雅。有没有更好的方法来进行定义导入/导出,或者这是最好的方法?
我的Dockerfile:

FROM rabbitmq:management
LABEL description="Rabbit image" version="0.0.1"
ADD init.sh /init.sh          
ADD rabbit_e6f2965776b0_2015-7-14.json /rabbit_config.json         
CMD ["/init.sh"]

init.sh

sleep 10 && curl -i -u guest:guest -d @/rabbit_config.json -H "content-type:application/json" http://localhost:15672/api/definitions -X POST &

rabbitmq-server $@
8hhllhi2

8hhllhi21#

1.使用rabbitmqadmin export rabbit.definitions.json导出定义。
1.使用Dockerfile将它们添加到镜像中:ADD rabbit.definitions.json /tmp/rabbit.definitions.json
1.在启动容器时添加环境变量,例如使用docker-compose.yml:

environment:
   - RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=-rabbitmq_management load_definitions "/tmp/rabbit.definitions.json"
gpfsuwkq

gpfsuwkq2#

有一个简单的方法可以将定义上传到Docker容器。使用预配置的节点将定义导出到json文件。
然后将此文件移动到您拥有Dockerfile的同一个文件夹中,并在同一个文件夹中创建rabbitmq.config。下面是rabbitmq.config的上下文:

[
    { rabbit, [
        { loopback_users, [ ] },
        { tcp_listeners, [ 5672 ] },
        { ssl_listeners, [ ] },
        { hipe_compile, false }
    ] },
    { rabbitmq_management, [ { listener, [
        { port, 15672 },
        { ssl, false }
    ] },
        { load_definitions, "/etc/rabbitmq/definitions.json" }
    ] }
].

然后准备一个合适的Dockerfile:

FROM rabbitmq:3.6.14-management-alpine
ADD definitions.json /etc/rabbitmq
ADD rabbitmq.config /etc/rabbitmq

EXPOSE 4369 5672 25672 15672

定义将在映像构建期间加载。当您运行容器时,所有定义都已应用。

3okqufwl

3okqufwl3#

您可以使用RabbitMQ启动容器,配置资源(队列,交换,绑定),然后将配置的容器提交为新映像。此映像可用于启动新容器。
更多详情请访问https://docs.docker.com/articles/basics/#committing-saving-a-container-state

zy1mlcev

zy1mlcev4#

我不确定这是一个选项,但处理这种情况的最简单方法是定期创建一个新的,空的RabbitMQ容器,并将其作为RabbitMQ集群的一部分加入第一个容器。队列的配置将被复制到第二个容器。
然后,您可以停止容器,并使用docker commit在新容器的docker仓库中创建版本化镜像。此过程将只保存您对镜像所做的更改,然后它将使您不必担心每次重新导入配置。您只需获得最新的镜像即可获得最新的配置!

wtzytmuj

wtzytmuj5#

现代版本支持直接在核心中导入定义,而无需预先配置管理插件。

# New in RabbitMQ 3.8.2.
# Does not require management plugin to be enabled.
load_definitions = /path/to/definitions/file.json

从Schema Definition Export and Import RabbitMQ文档。

bgibtngc

bgibtngc6#

如果你使用official rabbitmq image,你可以在/etc/rabbitmq中挂载定义文件,如下所示,rabbitmq将在守护进程启动时加载这个定义

docker run -v ./your_local_definitions_file.json:/etc/rabbitmq/definitions.json ......
6yt4nkrj

6yt4nkrj7#

我是这样做的:
1.我使用管理UI导入定义,并将文件命名为definitions.json

1.我创建了一个rabbitmq.conf文件,其中包含以下数据:
load_definitions = /etc/rabbitmq/definitions.json
配置文件格式
1.接下来,我创建了简单的dockerfile

FROM rabbitmq:management-alpine
    COPY definitions.json /etc/rabbitmq/definitions.json
    COPY rabbitmq.conf /etc/rabbitmq/rabbitmq.conf

1.构建映像:docker build -t your-image-name .
1.运行容器:docker run -d --name your-container-name -p 15672:15672 -p 5672:5672 your-image-name
请记住将所有文件放在一个文件夹中。

相关问题