Docker容器中Golang调用Odoo接口报连接拒绝错误如何解决
问题根因
Docker 容器默认拥有独立的网络命名空间,容器内的localhost指向的是容器自身的环回地址,而非宿主机或其他容器的网络地址。你在代码中硬编码了http://localhost:8091作为Odoo服务地址,当golang服务在容器内运行时,会尝试访问自身的8091端口,自然会触发连接拒绝报错。
Golang侧解决方案
推荐优先使用可配置的环境变量方案,灵活性最高,适配开发、生产多场景:
方案1:将Odoo服务地址改为从环境变量读取,保留本地开发默认值
调整代码如下:import "os" // 优先读取环境变量中的ODOO_API_URL,默认值保留本地开发时的localhost地址 var OdoobaseURL = getEnv("ODOO_API_URL", "http://localhost:8091/api/order") func getEnv(key, fallback string) string { if value, ok := os.LookupEnv(key); ok { return value } return fallback }运行golang容器时传入对应环境变量即可,需保证两个容器处于同一Docker网络下:
- docker run启动示例:
docker run -e ODOO_API_URL=http://<你的odoo容器名称>:8091/api/order <你的golang镜像名称> - docker-compose配置示例:
services: golang-service: image: 你的golang镜像名 environment: - ODOO_API_URL=http://odoo-service:8091/api/order odoo-service: image: 你的odoo镜像名 expose: - 8091- docker run启动示例:
方案2:开发环境临时硬编码(不推荐生产使用)
如果你仅需要本地开发临时调试,可以直接修改硬编码的地址:- Docker for Mac/Windows 环境可以改为
http://host.docker.internal:8091/api/order,该特殊域名会自动指向宿主机 - Linux 环境可以改为宿主机的局域网IP,同时保证odoo容器的8091端口已经映射到宿主机8091端口
- Docker for Mac/Windows 环境可以改为
内容的提问来源于stack exchange,提问作者Fahmi Roihan
相关产品推荐
相关产品推荐

