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

83qze16e  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(3)|浏览(192)

我尝试在Docker容器内启动RMQ,使用预先创建的队列qwer
在此之前,我使用的是简单的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

我认为这个任务有些简单,但是兔子本身的配置过程是最复杂的任务,文档有些不清楚。
我无法弄清楚它应该如何工作,即使经过4天的试验和谷歌搜索。
你能帮助我,如何写配置文件,以创建一个队列,并保留连接和交谈的能力?

9lowa7mx

9lowa7mx1#

其实你就快到了。
RabbitMQ有一个规则,即“guest”用户只能从localhost连接。由于您是在一个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,I used user/password作为您的用户名/密码。
在您的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
使用此停靠文件:

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 $@
ee7vknir

ee7vknir2#

你可以预定义队列和交换,而不需要创建自己的rabbit-mq docker映像。
您的Docker-compose应该如下所示:

rabbit:
container_name: rabbitmq-preload-conf
image: rabbitmq:3-management
volumes:
  - ./init/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
  - ./init/definitions.json:/etc/rabbitmq/definitions.json:ro
ports:
  - "5672:5672"
  - "15672:15672"

在这种情况下,rabbitmq.conf和definitions.json文件应该位于与docker-compose文件相同的父文件夹中的init文件夹中
rabbitmq.conf文件

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

定义. json文件

{
"queues": [
    {
        "name": "externally_configured_queue",
        "vhost": "/",
        "durable": true,
        "auto_delete": false,
        "arguments": {
            "x-queue-type": "classic"
        }
    }
],
"exchanges": [
    {
        "name": "externally_configured_exchange",
        "vhost": "/",
        "type": "direct",
        "durable": true,
        "auto_delete": false,
        "internal": false,
        "arguments": {}
    }
],
"bindings": [
    {
        "source": "externally_configured_exchange",
        "vhost": "/",
        "destination": "externally_configured_queue",
        "destination_type": "queue",
        "routing_key": "externally_configured_queue",
        "arguments": {}
    }
  ]
 }

注意:在Rabbit映像中更新后,可能需要额外的配置。如果Rabbit容器无法使用上述配置启动(错误消息包含“vhost”),则应将以下配置添加到定义文件中:

"users": [
    {
      "name": "guest",
      "password_hash": "BMfxN8drrYcIqXZMr+pWTpDT0nMcOagMduLX0bjr4jwud/pN",
      "hashing_algorithm": "rabbit_password_hashing_sha256",
      "tags": [
        "administrator"
      ],
      "limits": {}
    }
  ],
  "vhosts": [
    {
      "name": "/"
    }
  ],
  "permissions": [
    {
      "user": "guest",
      "vhost": "/",
      "configure": ".*",
      "write": ".*",
      "read": ".*"
    }
  ]

使用此附加配置,默认用户将是guest,密码为guest。
除了队列、交换和绑定之外,definitions.json文件还可以包含其他配置

lf5gs5x2

lf5gs5x23#

我发现使用init.sh并在definitions.json文件中提交未加密的密码的公认答案不足以满足我的需要,于是提出了以下解决方案:
从一个普通的RabbitMQ开始,通过Web UI配置其队列和用户,导出配置,然后将其复制到一个新的Docker映像中(或者,如果您愿意,您可以将其作为卷挂载到您选择的基础RabbitMQ映像中):
1.启动一个运行rabbitmq:3.9-management映像的容器,并将管理接口端口发布到localhost:

docker run -p 8080:15672 rabbitmq:3.9-management

1.在浏览器中访问http://localhost:8080,并使用用户名登录:客人,密码:
1.在RabbitMQ Web UI的 Queues 选项卡下配置和创建队列。同时创建您可能需要的任何其他用户。
1.导出 Overview 选项卡下的定义。将文件命名为definitions.json,并将其放置在空目录conf中:

$ tree .
.
└── conf
    └── definitions.json

1.创建一个文件rabbitmq.conf,其中包含一行:

load_definitions = /etc/rabbitmq/definitions.json

并将其放在conf目录中:

$ tree .
.
└── conf
    ├── definitions.json
    └── rabbitmq.conf

1.定义一个新的Docker映像,并将RabbitMQ定义复制到其中:

FROM rabbitmq:3.9-management
COPY conf/rabbitmq.conf /etc/rabbitmq/
COPY conf/definitions.json /etc/rabbitmq/

和一个docker-compose.yml文件来构建映像并运行容器:

version: "3.9"
services:

  my-rabbitmq:
    build: .
    ports:
    - 8082:15672

目录结构:

$ tree .
.
├── Dockerfile
├── conf
│   ├── definitions.json
│   └── rabbitmq.conf
└── docker-compose.yml

1.启动容器:

$ docker-compose -f docker-compose.yml up --build

并访问Web UI以确保已加载定义并创建队列。
如果您不想通过UI配置RabbitMQ,definitions.json文件是非常不言自明的,因此应该直接编辑它,以便添加新队列、创建新用户等,尽管您需要see the answer to this question来了解如何创建sha256哈希。

相关问题