Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 将代理定义导入停靠的RabbitMQ_Docker_Rabbitmq - Fatal编程技术网

Docker 将代理定义导入停靠的RabbitMQ

Docker 将代理定义导入停靠的RabbitMQ,docker,rabbitmq,Docker,Rabbitmq,我有一个RabbitMQ代理,已经定义了一些交换和队列。我知道我可以通过HTTP API导出和导入这些定义。我想对它进行Dockerize,并在它启动时导入所有代理定义 理想情况下,它可以像通过API一样轻松地完成。我可以编写一组rabbitmqctl命令,但是如果有很多定义,这可能需要相当长的时间。此外,其他人通过web界面所做的每一项更改都必须插入 我通过编写一个脚本来休眠一个curl请求并启动服务器,从而实现了我想要的功能,但这似乎很容易出错,而且并不优雅。有没有更好的方法进行定义导入/导

我有一个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"]
FROM rabbitmq:3.6.14-management-alpine
ADD definitions.json /etc/rabbitmq
ADD rabbitmq.config /etc/rabbitmq

EXPOSE 4369 5672 25672 15672
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 $@

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


更多详细信息参见

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


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

有一种将定义上载到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: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"]
FROM rabbitmq:3.6.14-management-alpine
ADD definitions.json /etc/rabbitmq
ADD rabbitmq.config /etc/rabbitmq

EXPOSE 4369 5672 25672 15672
定义将在映像生成期间加载。运行容器时,所有定义都已应用

  • 使用
    rabbitmqadmin导出rabbit.definitions.json
    导出定义

  • 使用Dockerfile将它们添加到图像中:
    Add rabbit.definitions.json/tmp/rabbit.definitions.json

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

    环境:
    -RABBITMQ_服务器\u附加\u ERL_参数=-RABBITMQ_管理加载\u定义“/tmp/rabbit.definitions.json”
    

  • 实际上,更深入地思考您的问题,如果使用RabbitMQ API的资源声明是幂等的,那么您为什么需要它,这样您就可以调用
    queueDeclare
    exchangeDeclare
    ,而不用担心资源是否已经存在。当我想重置配置并运行我的应用程序时,我总是重新创建我的容器,它配置RabbitMQ中所需的所有内容!我选择将my.json的内容粘贴到Docker机密中。