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

xak*_*p35 14 rabbitmq docker

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

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

rabbit:
    image: rabbitmq:management-alpine
    environment:
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest
Run Code Online (Sandbox Code Playgroud)

它工作得很好,只是它在开始时没有预先创建队列。现在我已经切换到自定义图像,如下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
Run Code Online (Sandbox Code Playgroud)

rabbitmq.confv3.7+ sysctl 样式的配置在哪里,有一行:

management.load_definitions = /etc/rabbitmq/definitions.json
Run Code Online (Sandbox Code Playgroud)

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

{
    "vhosts":[
        {"name":"/"}
    ],
    "queues":[
        {"name":"qwer","vhost":"/","durable":true,"auto_delete":false,"arguments":{}}
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在它开始拒绝登录:

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

SMi*_*los 24

您可以预定义队列和交换器,而无需创建自己的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"
Run Code Online (Sandbox Code Playgroud)

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

rabbitmq.conf 文件

management.load_definitions = /etc/rabbitmq/definitions.json
Run Code Online (Sandbox Code Playgroud)

定义.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": {}
    }
  ]
 }
Run Code Online (Sandbox Code Playgroud)

注意:更新兔子图像后,可能需要额外的配置。如果 Rabbit 容器无法使用上述配置启动(错误消息包含“启动时出现异常:exit:{error,{no_such_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": ".*"
    }
  ]
Run Code Online (Sandbox Code Playgroud)

使用此附加配置,默认用户将是 guest,密码为 guest。

除了队列、交换和绑定之外,definitions.json 文件还可以包含其他配置


mir*_*ana 6

你几乎就在那里。

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
Run Code Online (Sandbox Code Playgroud)

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

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

最后,对您的定义.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":{}}
    ]
}
Run Code Online (Sandbox Code Playgroud)

让我知道事情的后续!

看看这个链接

使用这个 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"]
Run Code Online (Sandbox Code Playgroud)

并使用这个 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 $@
Run Code Online (Sandbox Code Playgroud)


zac*_*314 6

我发现使用init.sh并提交文件中未加密的密码的接受答案definitions.json不足以满足我的需求,并提出了以下解决方案:

\n

从普通 RabbitMQ 开始,通过 Web UI 配置其队列和用户,导出配置,然后将其复制到新的 docker 映像中(或者,如果您愿意,您可以将其作为卷安装到您选择的基础 RabbitMQ 映像中) :

\n
    \n
  1. 启动运行图像的容器rabbitmq:3.9-management并将管理界面端口发布到本地主机:
  2. \n
\n
docker run -p 8080:15672 rabbitmq:3.9-management\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 在浏览器中访问 http://localhost:8080 并使用用户名:guest、密码:guest登录。

    \n
  2. \n
  3. 在 RabbitMQ Web UI 的“队列”选项卡下配置并创建队列。还可以创建您可能需要的任何其他用户。

    \n
  4. \n
  5. 导出概述选项卡下的定义。命名该文件definitions.json并将其放置在空目录中conf

    \n
  6. \n
\n
$ tree .\n.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 conf\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 definitions.json\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 创建一个文件 ,rabbitmq.conf包含单行:
  2. \n
\n
load_definitions = /etc/rabbitmq/definitions.json\n
Run Code Online (Sandbox Code Playgroud)\n

并将其放在conf目录中:

\n
$ tree .\n.\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 conf\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 definitions.json\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 rabbitmq.conf\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 定义一个新的 docker 镜像,并将 RabbitMQ 定义复制到其中:
  2. \n
\n
FROM rabbitmq:3.9-management\nCOPY conf/rabbitmq.conf /etc/rabbitmq/\nCOPY conf/definitions.json /etc/rabbitmq/\n
Run Code Online (Sandbox Code Playgroud)\n

以及docker-compose.yml用于构建映像并运行容器的文件:

\n
version: "3.9"\nservices:\n\n  my-rabbitmq:\n    build: .\n    ports:\n    - 8082:15672\n
Run Code Online (Sandbox Code Playgroud)\n

目录结构:

\n
$ tree .\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Dockerfile\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 conf\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 definitions.json\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 rabbitmq.conf\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 docker-compose.yml\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 启动容器:
  2. \n
\n
$ docker-compose -f docker-compose.yml up --build\n
Run Code Online (Sandbox Code Playgroud)\n

并访问 Web UI 以确保已加载定义并创建队列。

\n
\n

如果您不想通过 UI 配置 RabbitMQ,该definitions.json文件非常不言自明,因此应该直接编辑它以添加新队列、创建新用户等,尽管您需要查看关于如何创建 sha256 哈希值的问题的答案。

\n