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
相关产品推荐
相关产品推荐

