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

Docker部署Airflow连接SQL Server报Login timeout expired错误

问题根因

Login timeout expired不属于账号密码认证错误,是Docker容器内运行的Airflow服务根本无法和Windows宿主机上的SQL Server Express建立TCP连接,等待30秒连接超时后直接抛出的错误。

分步修复方案

1. 调整SQL Server Express基础连接配置

SQL Server Express默认配置不支持外部TCP连接,必须先改配置:

  • 打开SQL Server Configuration Manager,找到「SQL Server网络配置」-「SQLEXPRESS的协议」,将TCP/IP协议状态设置为「已启用」
  • 双击TCP/IP打开属性页,切换到「IP地址」标签,拉到页面最底部找到「IPAll」配置项,清空「TCP动态端口」的内容,将「TCP端口」设置为固定值1433
  • 回到服务列表,右键重启SQLEXPRESS服务,让端口配置生效
  • 打开Windows高级防火墙,新增1433端口的TCP入站放行规则,否则容器发的连接请求会被防火墙直接拦截

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

  • 容器内的localhost/127.0.0.1指向的是Airflow容器自身,不是你的Windows宿主机,绝对不能用这个地址写连接串
  • 如果你用Docker Desktop for Windows部署,直接将连接串里的数据库服务器地址替换为host.docker.internal,这是Docker Desktop内置的容器访问宿主机的专用域名
  • 如果你用Linux环境的Docker部署,启动Airflow容器时追加--add-host=host.docker.internal:host-gateway启动参数,之后同样用上面的域名访问宿主机

3. 修正pyodbc连接参数

从日志看你用了Trusted_Connection="yes"即Windows身份验证,容器内部不存在你的Windows系统账号凭据,这种认证方式必然失败:

  • 先通过SSMS连接本地SQL Server,启用SQL Server身份验证模式,创建一个专门给Airflow用的数据库账号,给这个账号分配目标库的读写权限
  • 替换原有连接串为如下格式,注意ODBC Driver 18默认强制加密连接,本地测试不需要配置证书,加参数跳过校验:
conn_str = (
    "DRIVER={ODBC Driver 18 for SQL Server};"
    "SERVER=host.docker.internal,1433;"
    "DATABASE=你的目标写入库名;"
    "UID=你创建的Airflow专用账号名;"
    "PWD=对应账号的密码;"
    "Encrypt=no;"
    "TrustServerCertificate=yes;"
    "Timeout=30;"
)

4. 提前验证连通性

不要改完直接跑DAG碰运气,先进容器验证网络是否通:

  • 执行docker ps找到Airflow worker容器的ID,执行docker exec -it 容器ID /bin/bash进入容器命令行
  • 在容器内执行nc -zv host.docker.internal 1433,如果返回连接成功的提示,说明网络层已经通了;如果还是超时,回头检查防火墙规则、SQL Server的TCP/IP配置是否正确
  • 网络连通后再触发DAG运行,写入任务即可正常执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:57:23