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

Docker容器中Python无法连接MSSQL的问题求助

Docker容器中Python连接MSSQL失败的问题解决

问题背景

本地运行Python连接MSSQL正常,但部署到Docker容器后无法建立连接,报错:
pymssql._pymssql.OperationalError: (20009, b'DB-Lib error message 20009, severity 9:\nUnable to connect: Adaptive Server is unavailable or does not exist (******)\n')

相关代码与配置如下:

Python连接代码(SQLAlchemy实现)

def connectsql():
    engine = sqlalchemy.create_engine(
        "mssql+pymssql://service name")
    ms_sql_conn = engine.connect()
    df = pd.read_sql('select * from table name',
                     ms_sql_conn,
                     parse_dates=["rest_date"])
    ms_sql_conn.close()

    return df

Dockerfile

FROM python:3
RUN pip install --upgrade pip --default-timeout=100 future
WORKDIR /check
COPY . /check
RUN pip install  -r requirements.txt

CMD [ "python", "/check/bot2.py" ]

docker-compose.yml

version: '3.1'

services:
  bot2:
    image: first
    build: ./
    restart: always

尝试过的pymssql直接连接代码

def connectsql2():
    conn = pymssql.connect(
        host=r'*******\********',
        user=r'*******',
        password=r'******',
        database='****',
    )
    cursor = conn.cursor()
    cursor.execute("select * from *********")
    row = cursor.fetchone()
    print(row)
    return row

解决步骤

1. 打通容器与MSSQL的网络连接

容器无法连接MSSQL的核心原因通常是网络不通,需根据MSSQL部署位置调整:

  • MSSQL在本地主机(Windows):在docker-compose.yml中给服务添加network_mode: "host",让容器直接复用宿主网络,即可访问本地MSSQL实例:
    version: '3.1'
    
    services:
      bot2:
        image: first
        build: ./
        restart: always
        network_mode: "host"
    
  • MSSQL在WSL2宿主机:不能用localhost,需替换为Windows主机的实际IP地址,同时确保MSSQL允许该IP远程访问。
  • MSSQL在远程服务器:检查容器所在网络能否ping通服务器IP,确认MSSQL默认端口1433已开放,且实例已开启TCP/IP协议、防火墙放行端口。

2. 修正Python连接代码,用环境变量传递配置

硬编码连接信息既不安全也不灵活,推荐用环境变量传递参数:

第一步:在docker-compose.yml中添加环境变量

version: '3.1'

services:
  bot2:
    image: first
    build: ./
    restart: always
    environment:
      - DB_HOST=你的MSSQL主机\实例名  # 例:192.168.1.100\SQLEXPRESS
      - DB_USER=数据库用户名
      - DB_PASSWORD=数据库密码
      - DB_NAME=目标数据库名

第二步:修改Python代码读取环境变量

SQLAlchemy版本
import os
import sqlalchemy
import pandas as pd

def connectsql():
    # 从环境变量读取配置
    db_host = os.getenv("DB_HOST")
    db_user = os.getenv("DB_USER")
    db_pass = os.getenv("DB_PASSWORD")
    db_name = os.getenv("DB_NAME")
    
    # 构建标准连接字符串
    connection_str = f"mssql+pymssql://{db_user}:{db_pass}@{db_host}/{db_name}"
    engine = sqlalchemy.create_engine(connection_str)
    
    # 使用with语句自动管理连接
    with engine.connect() as ms_sql_conn:
        df = pd.read_sql('select * from table name',
                         ms_sql_conn,
                         parse_dates=["rest_date"])
    return df
pymssql版本
import os
import pymssql

def connectsql2():
    conn = pymssql.connect(
        host=os.getenv("DB_HOST"),
        user=os.getenv("DB_USER"),
        password=os.getenv("DB_PASSWORD"),
        database=os.getenv("DB_NAME"),
    )
    with conn.cursor() as cursor:
        cursor.execute("select * from *********")
        row = cursor.fetchone()
        print(row)
    conn.close()
    return row

3. 补充Docker镜像依赖

pymssql依赖FreeTDS库,基于Debian的Python镜像默认未安装,需修改Dockerfile添加:

FROM python:3
# 安装FreeTDS依赖
RUN apt-get update && apt-get install -y freetds-dev
RUN pip install --upgrade pip --default-timeout=100 future
WORKDIR /check
COPY . /check
RUN pip install  -r requirements.txt

CMD [ "python", "/check/bot2.py" ]

4. 验证连接可用性

进入容器内部测试网络连通性:

  1. 进入容器:docker exec -it <容器名> bash
  2. 安装telnet:apt-get install telnet
  3. 测试端口:telnet <MSSQL主机IP> 1433,能连通则网络正常,否则排查MSSQL配置或防火墙。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:16:47