【问题标题】:Python Docker error: [FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect) on SQL ServerPython Docker 错误:[FreeTDS][SQL Server]无法连接到 SQL Server 上的数据源 (0) (SQLDriverConnect)
【发布时间】:2020-12-13 13:03:18
【问题描述】:

我正在尝试使用 Docker 从 Python 进行简单的 MS SQL Server 调用。如果我运行 python 执行脚本,SQL 连接能够建立,但它在 Docker 中不起作用

我的代码在下面

Dockerfile

from python:3

WORKDIR /code

COPY requirements.txt .


RUN apt-get update \
 && apt-get install unixodbc -y \
 && apt-get install unixodbc-dev -y \
 && apt-get install freetds-dev -y \
 && apt-get install freetds-bin -y \
 && apt-get install tdsodbc -y \
 && apt-get install --reinstall build-essential -y


RUN echo "[FreeTDS]\n\
Description = FreeTDS Driver\n\
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so\n\
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so" >> /etc/odbcinst.ini



#Pip command without proxy setting
RUN pip install -r requirements.txt

COPY src/ .

CMD ["python", "./producer.py"]

producer.py

import pyodbc



connP = pyodbc.connect('driver={FreeTDS};'
                       'server={MYSERV01\SQLEXPRESS};'
                       'database=ABCD;'                       
                       'uid=****;'
                       'pwd=*****')

requirement.txt

kafka-python
pyodbc==4.0.28

错误信息

我提到了this article 并做到了。我在网上搜索了解决方案并尝试了几个步骤,但没有任何帮助。我对 Docker 很陌生,没有 Python 经验,所以任何帮助都会非常好。提前致谢!

【问题讨论】:

    标签: python docker containers


    【解决方案1】:

    我试图连接到本地 SQL Server 数据库。我参考了很多文章,发现以下代码有效:

    服务器应该有host.docker.inter,<port_no>——这就是问题所在。当涉及到 sql server 与 docker 镜像不同的专用数据库时,直接提供服务器名称,但是当镜像和数据库都在同一服务器上时,以下代码有效。请检查 SQL 配置 TCP 地址 (IP4All) 中的端口号

    【讨论】:

    • 是逗号还是公关冒号?此外,如果您让服务器监听所有地址,那么监听0.0.0.0 也应该这样做。
    【解决方案2】:

    在您的 pyodbc.connect 中尝试将服务器设置为 '0.0.0.0' 而不是任何其他值。

    如果您想从容器内调试它,请在 Dockerfile 的最后一行 CMD 注释。

    构建您的 Docker 容器

    docker build -f Dockerfile -t achu-docker-container .
    

    运行你的 Docker 容器

    docker run -it achu-docker-container /bin/bash
    

    这会将您放入容器中。这就像 ssh 到另一台机器。

    转到您的工作目录

    cd code
    python ./producer.py
    

    你从上面得到了什么? (如果您使用apt-get install vim 安装任何编辑器,您将能够以交互方式编辑producer.py 文件并从正在运行的容器中修复您的问题。

    然后您可以将您的更改移动到您的源 Dockerfile 并使用它构建一个新的图像和容器。

    【讨论】:

    • 我确实按照步骤操作并在 cmd 中运行时出现此错误。 connP = pyodbc.connect('driver={FreeTDS};' pyodbc.OperationalError: ('08S01', '[08S01] [FreeTDS][SQL Server]无法连接: Adaptive Server 不可用或不存在 (20009) ( SQLDriverConnect)')
    • FreeTDS 服务器未在容器内运行。查看您是否在命令行中验证 hte 服务器正在运行。参考 - stackoverflow.com/questions/8511369/…
    • 感谢 Kumaran 先生 - 通过此链接和许多其他文章,我能够弄清楚。把答案贴在下面。
    猜你喜欢
    • 2014-09-14
    • 2018-04-23
    • 2019-10-16
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多