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

Docker Desktop中Azure Function App无法访问主机本地SQL Server数据库

问题诊断

你遇到的两个核心问题:

  1. ODBC驱动文件缺失:容器内安装的msodbcsql17驱动路径下找不到指定的.so文件,导致pyodbc无法加载驱动。
  2. 容器到主机MSSQL的连接方式错误:Linux容器无法识别Windows的命名实例格式HOME\SQLEXPRESS,同时需要确保主机的MSSQL允许远程连接。

解决方案

一、修复ODBC驱动安装问题

修改Dockerfile,调整驱动安装逻辑,确保驱动文件正确部署:

FROM python:3.10-slim-buster

WORKDIR /app

# Install system dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    g++ \
    wget \
    gnupg \
    apt-transport-https \
    lsb-release \
    && wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | apt-key add - \
    && wget -q https://packages.microsoft.com/config/debian/10/prod.list -O /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update \
    # 优先安装驱动并验证文件存在
    && ACCEPT_EULA=Y apt-get install -y --no-install-recommends msodbcsql17 \
    && ls -la /opt/microsoft/msodbcsql17/lib64/ \
    && apt-get install -y --no-install-recommends unixodbc-dev libicu-dev azure-functions-core-tools-4 \
    && rm -rf /var/lib/apt/lists/* 

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 7071

CMD ["func", "start", "--python"]
  • 调整安装顺序,先部署驱动再验证文件存在,避免依赖冲突;
  • 若msodbcsql17仍有问题,可替换为更新版本的msodbcsql18,对应安装命令改为ACCEPT_EULA=Y apt-get install -y msodbcsql18。

二、修正容器到主机MSSQL的连接配置

  1. 更新DB_HOST环境变量:
    在Docker Compose文件中,将DB_HOST=HOME\SQLEXPRESS替换为:

    - DB_HOST=host.docker.internal,1433
    

    (host.docker.internal是Docker Desktop提供的Windows主机别名,1433为SQL Server默认端口;若你的SQLEXPRESS使用动态端口,需先在SQL Server配置管理器中查询实际端口并替换1433)

  2. 开启主机MSSQL远程访问权限:

    • 打开SQL Server配置管理器,找到SQLEXPRESS实例,启用TCP/IP协议;
    • 在TCP/IP属性中,设置IP地址的TCP端口为1433(或查询到的动态端口);
    • 重启SQL Server服务;
    • 在Windows防火墙中添加入站规则,允许目标端口的TCP连接;
    • 在SSMS中确认user账号拥有远程访问权限(账号属性中勾选"允许远程连接到此服务器")。

三、验证Python连接字符串

确保代码中pyodbc连接字符串与容器内驱动版本匹配,示例:

import os
import pyodbc

conn_str = (
    f"DRIVER={{ODBC Driver 17 for SQL Server}};"
    f"SERVER={os.getenv('DB_HOST')};"
    f"DATABASE={os.getenv('DB_NAME')};"
    f"UID={os.getenv('DB_USERNAME')};"
    f"PWD={os.getenv('DB_PASS')}"
)
conn = pyodbc.connect(conn_str)
  • 若安装的是msodbcsql18,驱动名称需改为ODBC Driver 18 for SQL Server。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 19:45:23