我有一个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 $@
7条答案
按热度按时间8hhllhi21#
1.使用
rabbitmqadmin export rabbit.definitions.json
导出定义。1.使用Dockerfile将它们添加到镜像中:
ADD rabbit.definitions.json /tmp/rabbit.definitions.json
1.在启动容器时添加环境变量,例如使用docker-compose.yml:
gpfsuwkq2#
有一个简单的方法可以将定义上传到Docker容器。使用预配置的节点将定义导出到
json
文件。然后将此文件移动到您拥有Dockerfile的同一个文件夹中,并在同一个文件夹中创建
rabbitmq.config
。下面是rabbitmq.config
的上下文:然后准备一个合适的Dockerfile:
定义将在映像构建期间加载。当您运行容器时,所有定义都已应用。
3okqufwl3#
您可以使用RabbitMQ启动容器,配置资源(队列,交换,绑定),然后将配置的容器提交为新映像。此映像可用于启动新容器。
更多详情请访问https://docs.docker.com/articles/basics/#committing-saving-a-container-state
zy1mlcev4#
我不确定这是一个选项,但处理这种情况的最简单方法是定期创建一个新的,空的RabbitMQ容器,并将其作为RabbitMQ集群的一部分加入第一个容器。队列的配置将被复制到第二个容器。
然后,您可以停止容器,并使用docker commit在新容器的docker仓库中创建版本化镜像。此过程将只保存您对镜像所做的更改,然后它将使您不必担心每次重新导入配置。您只需获得最新的镜像即可获得最新的配置!
wtzytmuj5#
现代版本支持直接在核心中导入定义,而无需预先配置管理插件。
从Schema Definition Export and Import RabbitMQ文档。
bgibtngc6#
如果你使用official rabbitmq image,你可以在
/etc/rabbitmq
中挂载定义文件,如下所示,rabbitmq将在守护进程启动时加载这个定义6yt4nkrj7#
我是这样做的:
1.我使用管理UI导入定义,并将文件命名为
definitions.json
1.我创建了一个
rabbitmq.conf
文件,其中包含以下数据:load_definitions = /etc/rabbitmq/definitions.json
配置文件格式
1.接下来,我创建了简单的dockerfile
1.构建映像:
docker build -t your-image-name .
1.运行容器:
docker run -d --name your-container-name -p 15672:15672 -p 5672:5672 your-image-name
请记住将所有文件放在一个文件夹中。