将代理定义导入 Dockerized RabbitMQ

问题描述 投票:0回答:8

我有一个 RabbitMQ 代理,其中已经定义了一些交换和队列。我知道我可以通过 HTTP API 导出和导入这些定义。我想对其进行 Docker 化,并在启动时导入所有代理定义。

理想情况下,这将像通过 API 一样轻松完成。我可以编写一堆

rabbitmqctl
命令,但是如果有很多定义,这可能需要相当长的时间。此外,其他人通过网络界面所做的每项更改都必须插入。

我已经成功地通过编写一个脚本来休眠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"]

初始化.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 $@
docker rabbitmq
8个回答
9
投票
  1. 使用

    rabbitmqadmin export rabbit.definitions.json
    导出定义。

  2. 使用 Dockerfile 将它们添加到图像中:

    ADD rabbit.definitions.json /tmp/rabbit.definitions.json

  3. 启动容器时添加环境变量,例如使用docker-compose.yml:

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

4
投票

有一种简单的方法可以将定义上传到 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

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


0
投票

您可以使用 RabbitMQ 启动容器,配置资源(队列、交换、绑定),然后将配置的容器作为新映像提交。该镜像可用于启动新容器。

更多详细信息请访问 https://docs.docker.com/articles/basics/#committing- saving-a-container-state


0
投票

我不确定这是否是一个选项,但处理这种情况的绝对最简单的方法是定期创建一个新的空 RabbitMQ 容器,并将其加入第一个容器作为 RabbitMQ 集群的一部分。队列的配置将被复制到第二个容器。

然后,您可以停止容器并使用 docker commit 在新容器的 docker 存储库中创建版本化映像。此过程只会保存您对映像所做的更改,这样您就不必担心每次都重新导入配置。您只需获取最新的映像即可获得最新的配置!


0
投票

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

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

来自架构定义导出和导入 RabbitMQ 文档。


0
投票

如果您使用官方rabbitmq镜像,您可以在

/etc/rabbitmq
中挂载定义文件,如下所示,rabbitmq将在守护进程启动时加载此定义

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

0
投票

我是按照以下方式做到的:

  1. 我使用管理 UI 导入了定义,并调用了该文件
    definitions.json
  2. 我创建了一个包含以下数据的
    rabbitmq.conf
    文件:
    load_definitions = /etc/rabbitmq/definitions.json

    配置文件格式
  3. 接下来,我创建了简单的 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 .
  2. 运行容器:
    docker run -d --name your-container-name -p 15672:15672 -p 5672:5672 your-image-name

记得将所有文件放在一个文件夹中。


0
投票

我注意到 @autonomy 对 @andrey 回答有关 Docker 秘密的评论,并最终得到以下 yml 文件:

version: '3.8'

services:
  rabbit:
    image: rabbitmq:3.6.1-management
    environment:
      - RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=-rabbitmq_management load_definitions "/run/secrets/rabbit_config"
    secrets:
      - rabbit_config

secrets:
  rabbit_config:
    file: ./rabbit_definitions.json
© www.soinside.com 2019 - 2024. All rights reserved.