【问题标题】:How to create a queue in RabbitMQ upon startup如何在启动时在 RabbitMQ 中创建队列
【发布时间】:2020-02-04 13:55:17
【问题描述】:

我正在尝试在 docker 容器中启动 RMQ,并使用预先创建的队列 @9​​87654321@。

在此之前,我使用的是简单的docker-compose.yml 文件:

rabbit:
    image: rabbitmq:management-alpine
    environment:
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest

它工作得很好,只是它在开始时没有预先创建队列。 现在我已经切换到自定义图像,并关注Dockerfile

FROM rabbitmq:management-alpine

ADD rabbitmq.conf /etc/rabbitmq/
ADD definitions.json /etc/rabbitmq/

RUN chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf /etc/rabbitmq/definitions.json

rabbitmq.conf 是 v3.7+ sysctl 样式的配置,其中行:

management.load_definitions = /etc/rabbitmq/definitions.json

并且definitions.json 包含创建队列的尝试:

{
    "vhosts":[
        {"name":"/"}
    ],
    "queues":[
        {"name":"qwer","vhost":"/","durable":true,"auto_delete":false,"arguments":{}}
    ]
}

现在开始拒绝登录:

Error on AMQP connection <0.660.0> (172.18.0.6:48916 -> 172.18.0.10:5672, state: starting):
PLAIN login refused: user 'guest' - invalid credentials

本以为任务有些简单,但rabbit本身的配置过程是最复杂的任务,文档有些不清楚。

我无法弄清楚它应该如何工作,即使经过 4 天的试验和谷歌搜索..

您能帮我吗,如何编写配置文件,以创建队列并保留与其连接和交谈的能力?

【问题讨论】:

    标签: docker rabbitmq


    【解决方案1】:

    实际上你快到了。

    RabbitMQ 有一条规则,“guest”用户只能从 localhost 连接。由于您在 docker 上运行它,我假设您尝试通过以下方式从外部访问它:docker run &lt;rabbitmq-docker-img&gt; -p 15672:15672

    所以要解决这个问题,您需要做的是创建一个具有管理员权限的用户。

    首先,改变这个:

    rabbit:
        image: rabbitmq:management-alpine
        environment:
          RABBITMQ_DEFAULT_USER: user
          RABBITMQ_DEFAULT_PASS: password
    

    您可以使用 ath,我使用用户/密码作为您的用户/密码。

    在你的Dockerfile中,你可以添加:EXPOSE 15672如果你不想每次运行都暴露。

    最后,对你的 definitions.json 文件进行如下修改:

    {
        "users": [
          {
            "name": "user",  
            "password_hash": "password",
            "hashing_algorithm": "rabbit_password_hashing_sha256",
            "tags": "administrator"
          }
        ],
    
        "vhosts":[
            {"name":"/"}
        ],
        "queues":[
            {"name":"qwer","vhost":"/","durable":true,"auto_delete":false,"arguments":{}}
        ]
    }
    

    告诉我进展如何!

    看看这个link

    使用这个 Dockerfile:

    FROM rabbitmq
    
    # Define environment variables.
    ENV RABBITMQ_USER user
    ENV RABBITMQ_PASSWORD password
    
    ADD init.sh /init.sh
    EXPOSE 15672
    
    # Define default command
    CMD ["/init.sh"]
    

    并使用这个 init.sh:

    #!/bin/sh
    
    # Create Rabbitmq user
    ( sleep 5 ; \
    rabbitmqctl add_user $RABBITMQ_USER $RABBITMQ_PASSWORD 2>/dev/null ; \
    rabbitmqctl set_user_tags $RABBITMQ_USER administrator ; \
    rabbitmqctl set_permissions -p / $RABBITMQ_USER  ".*" ".*" ".*" ; \
    echo "*** User '$RABBITMQ_USER' with password '$RABBITMQ_PASSWORD' completed. ***" ; \
    echo "*** Log in the WebUI at port 15672 (example: http:/localhost:15672) ***") &
    
    # $@ is used to pass arguments to the rabbitmq-server command.
    # For example if you use it like this: docker run -d rabbitmq arg1 arg2,
    # it will be as you run in the container rabbitmq-server arg1 arg2
    rabbitmq-server $@
    

    【讨论】:

    • 您好,感谢您的意见。它在[info] &lt;0.270.0&gt; Importing users... CRASH REPORT Process &lt;0.269.0&gt; with 0 neighbours exited with reason: {error,&lt;&lt;"{not_base64,&lt;&lt;\"guest\"&gt;&gt;}"&gt;&gt;} in application_master:init/4 line 138 [info] &lt;0.43.0&gt; Application rabbit exited with reason: {error,&lt;&lt;"{not_base64,&lt;&lt;\"guest\"&gt;&gt;}"&gt;&gt;} 上崩溃
    • 我已将 user password 重命名为 guest guest,因为所有堆栈都配置为使用该凭据
    • 与端点的连接完成:amqp://guest:guest@rabbit:5672/
    • password_hash 更改为 password ,添加了 loopback_users = none。现在又出现了一个问题:access to vhost '/' refused for user 'guest'
    • 编辑了我的答案,看看那个链接。你需要将“用户”添加到虚拟主机“/”
    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2015-06-16
    • 2023-03-03
    • 2014-02-11
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多