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

