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

docker-compose部署报OSError,但docker run正常的问题求助

解决Docker Swarm部署时OSError: [Errno 97] Address family not supported by protocol问题

问题根源

Docker Swarm默认使用的overlay网络通常会启用IPv6支持,而docker run命令默认使用的bridge网络大多是禁用IPv6的。pika连接RabbitMQ时会优先尝试IPv6地址,但你的CentOS7镜像未正确配置IPv6协议栈,最终触发地址族不支持的错误。

解决方案

1. 强制pika使用IPv4连接

修改receive.py中的RabbitMQ连接逻辑,明确指定使用IPv4协议:

import socket
from pika import URLParameters, BlockingConnection

# 替换为你的RabbitMQ实际连接URL
rabbitmq_url = "amqp://rabbitmq_host:5672/%2F"
params = URLParameters(rabbitmq_url)
# 强制使用IPv4地址族
params.family = socket.AF_INET
# 可选:添加TCP_NODELAY优化连接性能
params.socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]

connection = BlockingConnection(params)

2. 禁用Swarm网络的IPv6

在docker-compose.yml中创建自定义overlay网络并关闭IPv6:

version: "3"

networks:
  service_net:
    driver: overlay
    enable_ipv6: false
    ipam:
      config:
        - subnet: 10.10.0.0/24

services:
  test:
    image: test_service:0.0.1
    environment:
      - PYTHONPATH=/usr/local/lib/python3.7/site-packages:${PYTHONPATH}
    networks:
      - service_net

3. 在容器内全局禁用IPv6

修改Dockerfile,在容器启动前关闭系统IPv6支持:

FROM recognai/python-37-centos:latest

COPY ./receive.py ./requirements.txt ./
RUN python3.7 -m pip install -r ./requirements.txt

# 禁用所有网络接口的IPv6
RUN echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf \
    && echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf \
    && sysctl -p

CMD ["python3", "-u", "receive.py"]

验证方式

部署完成后,进入容器执行以下命令确认IPv6已禁用:

cat /proc/sys/net/ipv6/conf/all/disable_ipv6

返回1则表示IPv6已成功关闭。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:00:24