docker Python请求模块在套接字连接上挂起,但cURL正常工作

5jvtdoz2  于 2023-03-07  发布在  Docker
关注(0)|答案(4)|浏览(129)

我正在尝试在Docker容器之间进行GET/POST请求。
在其中一个(其他工作正常)中,执行以下操作时:

ADDR = 'http://172.20.0.2:5002/see'
r = requests.post(ADDR, data=data, headers=headers)

在尝试连接时,命令会永远挂起(或者直到超时,如果定义了超时的话)。2它甚至不会建立连接:

^CTraceback (most recent call last):
  File "/workspace/master_server.py", line 35, in <module>
    r = requests.post(ADDR, data=data, headers=headers)
  File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 112, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/adapters.py", line 440, in send
    timeout=timeout
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py", line 357, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/lib/python3.5/http/client.py", line 1106, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python3.5/http/client.py", line 1151, in _send_request
    self.endheaders(body)
  File "/usr/lib/python3.5/http/client.py", line 1102, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python3.5/http/client.py", line 934, in _send_output
    self.send(msg)
  File "/usr/lib/python3.5/http/client.py", line 877, in send
    self.connect()
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connection.py", line 166, in connect
    conn = self._new_conn()
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connection.py", line 141, in _new_conn
    (self.host, self.port), self.timeout, **extra_kw)
  File "/usr/local/lib/python3.5/dist-packages/urllib3/util/connection.py", line 73, in create_connection
    sock.connect(sa)

如果我使用bash中的curl运行完全相同的请求,它会毫不费力地工作:

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '"[1215 2589 1392 3019]"' 'http://172.20.0.2:5002/see'

我尝试以完全相同的方式使用的任何其他容器都可以与requests模块或curl一起工作。关于如何修复它或至少有效地调试问题,有什么帮助吗?

e7arh2l6

e7arh2l61#

最近我在本地遇到了同样的问题,就像一些对最初问题的评论一样,我的代码在windows下工作,但在linux下不工作。几个小时后,我发现了我的问题的罪魁祸首:IPv6协议。
我使用的python模块尝试与服务器建立套接字连接,默认情况下使用IPv6。在我的Linux环境(Ubuntu 18.04)中关闭IPv6后,请执行以下步骤:
1.开放终端
1.输入:sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
1.输入:sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
模块按预期运行**。

    • 请注意,这些步骤可能因环境而异
ccrfmcuu

ccrfmcuu2#

我也遇到了同样的问题,损失了很多时间...在我的例子中,问题如下(guniconf.py):

workers = 1

变更为:

workers = 10  # any number is greater than 1
    • 更多信息:**有一个Flask应用程序为一些REST API提供服务。该应用程序有一个REST API方法(我们称之为A方法),该方法使用requests.post()在自身内部调用另一个REST API方法(我们称之为B方法)。当从A方法调用B方法时,应用程序挂起。据我所知,当调用A方法时,gunicorn工作进程处理它,但使用B方法时,没有更多的工作进程。
cngwdvgl

cngwdvgl3#

我最近在MacOS( Catalina )上遇到了同样的问题,结果是由于IPv6。
我必须进入系统偏好设置-〉网络-〉Wi-Fi -〉高级-〉TCP/IP,并将配置IPv6更改为仅链接本地(列表中没有“关闭”选项,尽管这也适用),然后单击确定并应用。
您也可以使用以下命令完全禁用:

sudo networksetup -setv6off Wi-Fi
vnjpjtjt

vnjpjtjt4#

我在MacOS主机上运行docker compose的Debian container时遇到了这个错误。根据@Ben Elliot的回答,我通过在docker-compose.yaml的container配置中添加以下内容来禁用IPv6:

sysctls:
- net.ipv6.conf.all.disable_ipv6=1

示例:

services:
  srv_a:
    build: ...
    sysctls:
    - net.ipv6.conf.all.disable_ipv6=1
    ...

相关问题