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

如何实现Docker环境下Mage.ai Pipeline与本地开发服务器的连接

解决Mage.ai容器无法连接本地Flask微服务的问题

问题概述

本地基于Vue+Flask开发的微服务,已验证端点在本地可正常访问(curl返回有效token),Flask服务绑定0.0.0.0,但Docker容器内的Mage.ai pipeline无法ping通主机的局域网IP(172.22.15.213),导致API调用失败。

解决方案

1. 修正Docker容器访问主机的地址

Docker容器默认桥接网络无法直接访问主机的局域网IP,需使用专属地址:

  • Windows/macOS:使用Docker内置的host.docker.internal替代172.22.15.213
  • Linux:使用Docker桥接网关地址(通常是172.17.0.1,可通过ip addr show docker0确认)

修改代码中的地址配置:

# 修改amic_login函数的base_url
def amic_login(custom_args, config_data):
    # Windows/macOS 版本
    base_url = "http://host.docker.internal:4999"
    # Linux 版本(替换为实际网关地址)
    # base_url = "http://172.17.0.1:4999"
    login_endpoint = f"{base_url}/user/login"
    # ... 其余代码不变
# 修改enviar_mensaje_amic函数的请求地址
def enviar_mensaje_amic(custom_args, res, msg, token): 
    # ... 其余代码不变
    # Windows/macOS 版本
    response = requests.post("http://host.docker.internal:5009/receive_results", json=result, headers=headers)
    # Linux 版本
    # response = requests.post("http://172.17.0.1:5009/receive_results", json=result, headers=headers)
    # ... 其余代码不变

2. 验证网络连通性

在Docker容器内执行ping测试确认连通:

# Windows/macOS
ping host.docker.internal
# Linux
ping 172.17.0.1

若能正常收到响应,再测试API调用。

3. 检查主机防火墙设置

主机防火墙可能拦截了Docker容器的请求:

  • 临时关闭防火墙测试连通性:
    # Ubuntu/Debian
    sudo ufw disable
    # CentOS/RHEL
    sudo systemctl stop firewalld
    
  • 测试通过后,开放对应端口的永久规则:
    # Ubuntu/Debian
    sudo ufw allow 4999/tcp
    sudo ufw allow 5009/tcp
    # CentOS/RHEL
    sudo firewall-cmd --add-port=4999/tcp --permanent
    sudo firewall-cmd --add-port=5009/tcp --permanent
    sudo firewall-cmd --reload
    

4. 确认Flask服务监听配置

确保Flask服务确实绑定0.0.0.0:

  • 执行以下命令检查端口监听状态:
    netstat -tulpn | grep -E "4999|5009"
    
    输出需显示0.0.0.0:4999和0.0.0.0:5009,而非127.0.0.1。

5. 增强API调试日志

添加更详细的错误信息定位问题:

def amic_login(custom_args, config_data):
    # ... 其余代码不变
    try:
        response = requests.post(login_endpoint, json=payload)
        response.raise_for_status()  # 主动抛出HTTP错误
        response_data = response.json()
        if "token" not in response_data:
            raise Exception("响应中未包含token")
        return response_data['token']
    except requests.exceptions.RequestException as e:
        error_msg = f"请求失败: {str(e)}"
        if e.response:
            error_msg += f", 状态码: {e.response.status_code}, 响应内容: {e.response.text}"
        raise Exception(error_msg)
    except Exception as e:
        raise Exception(f"认证错误: {str(e)}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:39:57