Docker Compose部署RabbitMQ遇no_such_vhost错误,求配置修改方案
如何配置Docker Compose让RabbitMQ启动后自动创建myqueue队列?
问题背景
需要编写Docker Compose配置,使RabbitMQ容器启动后直接可用名为myqueue的队列。当前配置启动时报错no_such_vhost,<<"/">>,已尝试两种方案未解决。
当前Docker Compose配置
version: '3.8' services: rabbitmq: image: "rabbitmq:latest" ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_DEFAULT_USER: user RABBITMQ_DEFAULT_PASS: pass RABBITMQ_DEFAULT_VHOST: / volumes: - type: bind source: rabbitmq-enabled-plugins target: /etc/rabbitmq/enabled_plugins - type: bind source: rabbitmq.config target: /etc/rabbitmq/rabbitmq.config - type: bind source: rabbitmq-defs.json target: /etc/rabbitmq/rabbitmq-defs.json
配套文件内容
rabbitmq-enabled-plugins
[rabbitmq_management].
rabbitmq.config
[ { rabbit, [ {default_user, <<"user">>}, {default_pass, <<"pass">>}, {default_vhost, <<"/">>}, { loopback_users, [] } ] }, { rabbitmq_management, [ { load_definitions, "/etc/rabbitmq/rabbitmq-defs.json" } ] } ].
rabbitmq-defs.json
{ "exchanges": [ { "name": "myqueue", "vhost": "/", "type": "fanout", "durable": true, "auto_delete": false, "internal": false, "arguments": {} } ], "queues": [ { "name": "myqueue", "vhost": "/", "durable": true, "auto_delete": false, "arguments": {} } ], "bindings": [ { "source": "myqueue", "vhost": "/", "destination": "myqueue", "destination_type": "queue", "routing_key": "*", "arguments": {} } ] }
启动报错信息
BOOT FAILED =========== Exception during startup: exit:{error,{no_such_vhost,<<"/">>}} rabbit_boot_steps:-run_step/2-lc$^0/1-0-/2, line 45 rabbit_boot_steps:run_step/2, line 48 rabbit_boot_steps:-run_boot_steps/1-lc$^0/1-0-/1, line 19 rabbit_boot_steps:run_boot_steps/1, line 20 rabbit:start/2, line 958 application_master:start_it_old/4, line 293 Kernel pid terminated (application_controller) ({application_start_failure,rabbit,{{error,{no_such_vhost,<<"/">>}},{rabbit,start,[normal,[]]}}})
已尝试的无效方案
- 移除
rabbitmq-defs.json中的vhost字段,无效果 - 尝试通过Dockerfile解决,但遇到curl相关问题,方案不够优雅
解决方法
报错原因是RabbitMQ加载定义文件的步骤早于默认vhost的创建流程,导致定义中的队列/交换机找不到对应的vhost。以下是两种可行的修复方案:
方案1:调整配置加载顺序,优先创建默认vhost
删除rabbitmq.config中关于default_user、default_pass、default_vhost的配置,保留环境变量中的配置。环境变量的初始化逻辑会先于定义文件加载,确保默认vhost和用户先被创建:
修改后的rabbitmq.config:
[ { rabbit, [ { loopback_users, [] } ] }, { rabbitmq_management, [ { load_definitions, "/etc/rabbitmq/rabbitmq-defs.json" } ] } ].
Docker Compose中的环境变量保持不变,无需修改。
方案2:在定义文件中显式声明vhost、用户和权限
修改rabbitmq-defs.json,添加vhosts、users和permissions节点,确保所有依赖资源都在定义文件中存在:
{ "vhosts": [ { "name": "/", "tags": "" } ], "users": [ { "name": "user", "password_hash": "pbkdf2_sha256$150000$你的密码哈希值", "hashing_algorithm": "pbkdf2_sha256", "tags": "administrator" } ], "permissions": [ { "user": "user", "vhost": "/", "configure": ".*", "write": ".*", "read": ".*" } ], "exchanges": [ { "name": "myqueue", "vhost": "/", "type": "fanout", "durable": true, "auto_delete": false, "internal": false, "arguments": {} } ], "queues": [ { "name": "myqueue", "vhost": "/", "durable": true, "auto_delete": false, "arguments": {} } ], "bindings": [ { "source": "myqueue", "vhost": "/", "destination": "myqueue", "destination_type": "queue", "routing_key": "*", "arguments": {} } ] }
注意:password_hash需要替换为实际密码的哈希值,可通过以下命令生成:
rabbitmqctl hash_password pass
验证方法
启动容器后,访问http://localhost:15672,使用user/pass登录管理后台,查看Queues和Exchanges标签页,确认myqueue队列、交换机及绑定关系已正确创建。
内容的提问来源于stack exchange,提问作者Ta3ik
相关产品推荐
相关产品推荐

