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. 验证连接可用性
进入容器内部测试网络连通性:
- 进入容器:
docker exec -it <容器名> bash - 安装telnet:
apt-get install telnet - 测试端口:
telnet <MSSQL主机IP> 1433,能连通则网络正常,否则排查MSSQL配置或防火墙。
内容的提问来源于stack exchange,提问作者easyfreeze
相关产品推荐
相关产品推荐

