我有一个RabbitMQ代理,其中已经定义了一些交换和队列。我知道我可以通过HTTP API导出和导入这些定义。我想Dockerize它,并在启动时导入所有代理定义。
理想情况下,它可以像通过API一样轻松完成。我可以写一堆rabbitmqctl
命令,但是有很多定义,这可能需要相当长的时间。此外,必须插入其他人通过Web界面进行的更改。
我已经设法通过编写一个睡眠卷曲请求并启动服务器的脚本来做我想要的事情,但这似乎容易出错并且真的不优雅。有没有更好的方法来进行定义导入/导出 ,或者这是最好的办法吗?
我的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 $@
答案 0 :(得分:1)
有一种将定义上传到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
将在图像构建期间加载定义。运行容器时,将应用所有定义。
答案 1 :(得分:1)
rabbitmqadmin export rabbit.definitions.json
导出定义。ADD rabbit.definitions.json /tmp/rabbit.definitions.json
在启动容器时添加一个环境变量,例如,使用docker-compose.yml:
environment:
- RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=-rabbitmq_management load_definitions "/tmp/rabbit.definitions.json"
答案 2 :(得分:0)
您可以使用RabbitMQ启动容器,配置资源(队列,交换,绑定),然后将配置的容器作为新映像提交。此图像可用于启动新容器。
https://docs.docker.com/articles/basics/#committing-saving-a-container-state
的更多详情答案 3 :(得分:0)
我不确定这是一个选项,但处理这种情况的绝对最简单的方法是定期创建一个新的空RabbitMQ容器并让它作为RabbitMQ集群的一部分加入第一个容器。队列的配置将被复制到第二个容器。
然后,您可以使用docker commit停止容器并在新容器的docker存储库中创建版本化映像。此过程仅保存您对映像所做的更改,然后使您不必担心每次都重新导入配置。您只需要获取最新图像即可获得最新配置!