我正在尝试在 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.conf
v3.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 文件还可以包含其他配置
你几乎就在那里。
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)
我发现使用init.sh
并提交文件中未加密的密码的接受答案definitions.json
不足以满足我的需求,并提出了以下解决方案:
从普通 RabbitMQ 开始,通过 Web UI 配置其队列和用户,导出配置,然后将其复制到新的 docker 映像中(或者,如果您愿意,您可以将其作为卷安装到您选择的基础 RabbitMQ 映像中) :
\nrabbitmq:3.9-management
并将管理界面端口发布到本地主机:docker run -p 8080:15672 rabbitmq:3.9-management\n
Run Code Online (Sandbox Code Playgroud)\n在浏览器中访问 http://localhost:8080 并使用用户名:guest、密码:guest登录。
\n在 RabbitMQ Web UI 的“队列”选项卡下配置并创建队列。还可以创建您可能需要的任何其他用户。
\n导出概述选项卡下的定义。命名该文件definitions.json
并将其放置在空目录中conf
:
$ 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)\nrabbitmq.conf
包含单行:load_definitions = /etc/rabbitmq/definitions.json\n
Run Code Online (Sandbox Code Playgroud)\n并将其放在conf
目录中:
$ 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)\nFROM 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
用于构建映像并运行容器的文件:
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$ docker-compose -f docker-compose.yml up --build\n
Run Code Online (Sandbox Code Playgroud)\n并访问 Web UI 以确保已加载定义并创建队列。
\n如果您不想通过 UI 配置 RabbitMQ,该definitions.json
文件非常不言自明,因此应该直接编辑它以添加新队列、创建新用户等,尽管您需要查看关于如何创建 sha256 哈希值的问题的答案。
归档时间: |
|
查看次数: |
8217 次 |
最近记录: |