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
相关产品推荐
相关产品推荐

