容器内Curl请求失败排查:Python服务跨容器访问403问题
问题分析与解决方案
从你提供的错误日志里能直接定位到问题根源:容器内的curl请求被系统代理拦截了。看这段关键日志:
* Uses proxy env variable http_proxy == 'http://10.223.4.20:911'
虽然你给容器设置了network_mode: host,容器里的localhost确实指向主机,但容器继承了主机的http_proxy环境变量,却没有像主机那样配置「忽略本地地址的代理规则」,导致请求被转发到代理服务器,最终返回403权限拒绝。
下面是几个可行的解决办法:
临时解决:curl命令跳过代理
在容器内执行curl时,加上--noproxy localhost参数,强制让这个请求不走代理:
curl --noproxy localhost --header "Content-Type: application/json" --data '{"uid":"admin","password":"admin"}' http://localhost:9000/auth
(注:--request POST可以省略,因为使用--data参数时curl会自动采用POST方法)
持久解决:给容器配置忽略代理的环境变量
在你的docker-compose.yml里,给需要访问本地服务的容器添加NO_PROXY环境变量,让它对localhost/127.0.0.1地址跳过代理。比如修改tts_driver的配置:
services: tts_driver: image: tts_driver privileged: true network_mode: host environment: - ASR_PUB_PORT=5555 - ASR_PUB_TOPIC=subnlptopic - TTS_DRIVER_PUB_PORT=5556 - TTS_DRIVER_PUB_TOPIC=pubttstopic - NO_PROXY=localhost,127.0.0.1 # 新增这一行 command: python3 /app/TTSDriver.py
如果是其他需要执行curl的容器,同样添加这个环境变量即可。
彻底解决:取消容器的代理环境变量
如果你的容器不需要使用全局代理,可以直接在docker-compose里清空代理相关的环境变量:
environment: - http_proxy= - https_proxy= # 保留原来的其他环境变量
这样容器内的所有请求都不会走代理,自然能正常访问主机的localhost服务。
内容的提问来源于stack exchange,提问作者Akshay Vijapur
相关产品推荐
相关产品推荐

