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

Docker容器连接SQL Server时出现ODBC error 10054问题求助

问题:Docker容器中pyodbc连接SQL Server失败(错误0x2746/10054)

环境与代码

Dockerfile

FROM python:3.9

RUN apt-get -y update && apt-get install -y curl gnupg

RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -

# download appropriate package for the OS version
# Debian 11
RUN curl https://packages.microsoft.com/config/debian/11/prod.list  \
    > /etc/apt/sources.list.d/mssql-release.list

RUN exit
RUN apt-get -y update
RUN ACCEPT_EULA=Y apt-get install -y msodbcsql18

# upgrade pip and install requirements.
COPY /requirements.txt /requirements.txt
RUN pip install --upgrade pip
RUN pip install -r /requirements.txt

COPY . /app
WORKDIR /app

CMD ["python", "myapp.py"]

Python连接代码(myapp.py片段)

cnxn = pyodbc.connect('DRIVER={ODBC Driver 18 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)

错误信息

cnxn = pyodbc.connect('DRIVER={ODBC Driver 18 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
pyodbc.OperationalError: ('08001', '[08001] [unixODBC][Microsoft][ODBC Driver 18 for SQL Server]TCP Provider: Error code 0x2746 (10054) (SQLDriverConnect)')

排查与解决步骤

  • 先修复Dockerfile的致命错误:你的Dockerfile里包含RUN exit指令,这会直接中断镜像构建流程,导致后续的apt-get update、安装ODBC驱动、复制代码等步骤完全没有执行。容器内根本没装msodbcsql18驱动,这是连接失败的核心原因之一。必须删掉这行指令,重新构建镜像。

  • 优化Dockerfile(确保驱动正常安装):合并APT命令减少镜像层数,同时添加unixodbc-dev(pyodbc编译依赖),修改后的Dockerfile如下:

    FROM python:3.9
    
    RUN apt-get update -y && apt-get install -y curl gnupg unixodbc-dev \
        && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
        && curl https://packages.microsoft.com/config/debian/11/prod.list > /etc/apt/sources.list.d/mssql-release.list \
        && apt-get update -y \
        && ACCEPT_EULA=Y apt-get install -y msodbcsql18
    
    COPY requirements.txt .
    RUN pip install --upgrade pip && pip install -r requirements.txt
    
    COPY . /app
    WORKDIR /app
    
    CMD ["python", "myapp.py"]
    
  • 确认SQL Server网络可达性:容器必须能访问SQL Server的主机/IP和默认端口1433。如果是本地SQL Server,不要用localhost,改用宿主机IP或者host.docker.internal(Docker Desktop环境);如果是云SQL实例,检查防火墙规则,允许容器所在IP段访问1433端口。

  • 处理TLS强制加密问题:ODBC Driver 18默认要求加密连接,若SQL Server未配置有效SSL证书,会触发连接失败。在连接字符串中添加TrustServerCertificate=yes或者Encrypt=optional即可解决,推荐用f-string简化字符串拼接:

    cnxn = pyodbc.connect(f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password};TrustServerCertificate=yes')
    
  • 验证容器内驱动状态:进入运行中的容器,执行odbcinst -q -d,确认输出中包含ODBC Driver 18 for SQL Server,确保驱动安装成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:55:18