You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dockerfile配置RabbitMQ时出现OSError: Cannot assign requested address错误

问题原因

Docker镜像构建阶段执行RUN指令时,RabbitMQ服务并未启动。官方rabbitmq:3.11-management镜像的RabbitMQ服务是在容器启动时由入口脚本初始化并启动的,而非镜像构建阶段。因此在RUN阶段调用rabbitmqadmin时,无法连接到未运行的RabbitMQ服务,导致连接失败。

解决方案

将初始化逻辑放入RabbitMQ容器的启动钩子脚本中,让其在容器启动、RabbitMQ服务就绪后自动执行。官方RabbitMQ镜像支持将自定义脚本放入/docker-entrypoint-init.d/目录,容器启动时会依次执行该目录下的可执行脚本。

步骤1:创建初始化脚本

新建init-rabbitmq.sh文件,内容如下:

#!/bin/bash

# 等待RabbitMQ服务完全就绪
until rabbitmqctl status; do
  echo "等待RabbitMQ服务启动..."
  sleep 2
done

# 执行初始化命令
rabbitmqadmin declare exchange name=test-exchange type=direct
rabbitmqadmin declare queue name=test-queue durable=false
rabbitmqadmin declare binding source="test-exchange" destination_type="queue" destination="test-queue" routing_key="test-key"

步骤2:修改Dockerfile

更新Dockerfile,将初始化脚本复制到指定目录并赋予执行权限:

FROM rabbitmq:3.11-management

LABEL purpose=workshops
LABEL case=stats
LABEL apptype=Queue

# 复制初始化脚本到启动钩子目录
COPY init-rabbitmq.sh /docker-entrypoint-init.d/
# 赋予脚本执行权限
RUN chmod +x /docker-entrypoint-init.d/init-rabbitmq.sh

EXPOSE 5673 15673

步骤3:构建并运行容器

执行镜像构建命令:

docker image build -t rabbitmq:1 -f Dockerfile .

启动容器后,初始化脚本会自动执行,完成交换机、队列的创建和绑定操作。

额外优化说明

可以使用rabbitmqctl wait命令替代循环检查,更简洁地等待服务就绪:

rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit@$(hostname).pid

该命令会阻塞直到RabbitMQ服务完全启动,无需手动循环判断。

内容的提问来源于stack exchange,提问作者Kamil Stadryniak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:15:42