如何在启动时在RabbitMQ中创建队列

问题描述 投票:0回答:1

我正在尝试使用预先创建的队列qwer在docker容器内启动RMQ。

在此之前,我使用的是简单的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个回答
0
投票

您实际上几乎在那里。

RabbitMQ有一个规则,即“来宾”用户只能从本地主机连接。由于您是在docker上运行它,因此我假设您尝试通过执行以下操作来暴露来自外部的端口“ 15672”:docker run <rabbitmq-docker-img> -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 $@
© www.soinside.com 2019 - 2024. All rights reserved.