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

