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

Docker build阶段执行脚本连接RabbitMQ报socket.gaierror: [Errno -2]错误

问题根因

你遇到的异常本质是对Docker构建阶段、运行阶段的机制不熟悉导致的:

  • 把python3 manager.py写在Dockerfile的RUN指令中时,命令是在镜像构建阶段执行的。这个阶段只会启动一个临时的构建容器,既不会加载docker-compose定义的rabbitmqnet网络,也不会启动RabbitMQ服务,你配置的rabbitmq主机名只有在容器正式启动、加入指定网络后才会被DNS解析,构建阶段根本找不到这个主机,自然报Name or service not known错误。
  • 把脚本作为后台进程启动时失败,是因为后台进程和RabbitMQ服务是同时启动的,脚本发起连接时RabbitMQ还没完成初始化、5672端口还没开始监听,连接自然会失败。
  • 你手动进入容器执行脚本能成功,是因为进入容器时RabbitMQ已经完全启动、网络配置也全部生效,不存在上述时序、环境隔离问题。
修复方案

1. 调整Dockerfile

删掉Dockerfile里构建阶段执行初始化脚本的RUN python3 manager.py行,把初始化逻辑挪到容器启动、RabbitMQ就绪之后执行,改完的Dockerfile如下:

FROM rabbitmq:3-management
WORKDIR /app
EXPOSE 15672 5672
COPY . /app

# 安装依赖,清理安装缓存减小镜像体积
RUN apt-get update -y \
    && apt-get install -y --no-install-recommends python3 python3-pip netcat-openbsd \
    && pip install --no-cache-dir -r requirements.txt \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 编写启动脚本:先启动RabbitMQ等待就绪,配置账号后执行初始化,最后前台运行服务
RUN printf '#!/bin/bash\n\
# 后台启动RabbitMQ做初始化\n\
rabbitmq-server -detached\n\
# 轮询等待5672端口就绪\n\
until nc -z localhost 5672; do\n\
  echo "RabbitMQ未就绪,2秒后重试"\n\
  sleep 2\n\
done\n\
# 配置账号权限(和你config.py里的账号密码保持一致)\n\
rabbitmqctl add_user user password\n\
rabbitmqctl set_permissions -p / user ".*" ".*" ".*"\n\
# 执行初始化脚本\n\
python3 /app/manager.py\n\
# 停止临时启动的RabbitMQ,以前台模式重新启动防止容器退出\n\
rabbitmqctl stop\n\
exec rabbitmq-server\n' > /usr/local/bin/start.sh \
&& chmod +x /usr/local/bin/start.sh

CMD ["/usr/local/bin/start.sh"]

2. 修改config.py配置

因为初始化脚本和RabbitMQ运行在同一个容器里,直接走本地回环地址连接即可,不需要走跨容器的域名解析,把server配置改成本地地址:

server= 'localhost'
port= 5672
user= 'user'
password= 'password'

3. 调整docker-compose.yml

可以去掉冗余的env_file配置,直接用RabbitMQ官方镜像支持的环境变量配置默认账号,避免账号配置不一致的问题:

version: "3.8"
services:
  rabbitmq:
    container_name: rabbitmq
    build: src/server/
    environment:
      - RABBITMQ_DEFAULT_USER=user
      - RABBITMQ_DEFAULT_PASS=password
    ports:
      - "15672:15672"
      - "5672:5672"
    hostname: rabbitmq
    networks:
      - rabbitmqnet
    restart: unless-stopped

networks:
  rabbitmqnet:
    name: rabbitmqnet
    driver: bridge
注意事项
  • 不要在Dockerfile的RUN指令里执行任何需要依赖运行时网络、其他容器服务、当前容器进程的操作,构建环境和运行环境是完全隔离的。
  • 容器内启动多个关联进程时一定要加就绪检测,不要直接并行启动,否则很容易出现连接时序问题。
  • 同容器内的服务通信优先用localhost地址,减少不必要的网络转发和DNS解析环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 12:45:26