我有一个 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 $@
使用
rabbitmqadmin export rabbit.definitions.json
导出定义。
使用 Dockerfile 将它们添加到图像中:
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"
有一种简单的方法可以将定义上传到 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
定义将在图像构建期间加载。当您运行容器时,所有定义都将已应用。
您可以使用 RabbitMQ 启动容器,配置资源(队列、交换、绑定),然后将配置的容器作为新映像提交。该镜像可用于启动新容器。
更多详细信息请访问 https://docs.docker.com/articles/basics/#committing- saving-a-container-state
我不确定这是否是一个选项,但处理这种情况的绝对最简单的方法是定期创建一个新的空 RabbitMQ 容器,并将其加入第一个容器作为 RabbitMQ 集群的一部分。队列的配置将被复制到第二个容器。
然后,您可以停止容器并使用 docker commit 在新容器的 docker 存储库中创建版本化映像。此过程只会保存您对映像所做的更改,这样您就不必担心每次都重新导入配置。您只需获取最新的映像即可获得最新的配置!
现代版本支持直接在核心导入定义,无需预先配置管理插件。
# New in RabbitMQ 3.8.2.
# Does not require management plugin to be enabled.
load_definitions = /path/to/definitions/file.json
来自架构定义导出和导入 RabbitMQ 文档。
如果您使用官方rabbitmq镜像,您可以在
/etc/rabbitmq
中挂载定义文件,如下所示,rabbitmq将在守护进程启动时加载此定义
docker run -v ./your_local_definitions_file.json:/etc/rabbitmq/definitions.json ......
我是按照以下方式做到的:
definitions.json
rabbitmq.conf
文件: load_definitions = /etc/rabbitmq/definitions.json
FROM rabbitmq:management-alpine
COPY definitions.json /etc/rabbitmq/definitions.json
COPY rabbitmq.conf /etc/rabbitmq/rabbitmq.conf
docker build -t your-image-name .
docker run -d --name your-container-name -p 15672:15672 -p 5672:5672 your-image-name
记得将所有文件放在一个文件夹中。
我注意到 @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