【问题标题】:Access external SQL server from inside of Docker从 Docker 内部访问外部 SQL 服务器
【发布时间】:2018-02-19 02:02:59
【问题描述】:

我很难让我的 docker 容器访问 MS SQL 服务器。我曾尝试在此处遵循this 指南,但无济于事。

这是我的基础 Dockerfile:

FROM python:3
ADD ./odbcinst.ini /etc/odbcinst.ini
RUN apt-get update && apt-get install gcc
RUN apt-get install -y tdsodbc unixodbc-dev
RUN apt-get install unixodbc-bin -y
RUN apt-get clean -y
RUN apt-get update && apt-get install -y gcc unixodbc-dev mssql-python-pyodbc

RUN pip install pyodbc
RUN pip install plaster_pastedeploy pyramid pyramid_jinja2 pyramid_debugtoolbar waitress yagmail pyodbc

这是扩展它的另一个 docker 文件:

FROM pyodbc
COPY . .
RUN pip install -e companalysis/
CMD [ "pserve", "companalysis/development.ini" ]
EXPOSE 8081

这是我的 sql 连接字符串:

strconn = 'DRIVER=
{FreeTDS};SERVER=192.168.0.6;
DATABASE=xxxx;UID=xxxx;PWD=xxx'

无论我做什么我都会得到这个错误:

Error: ('01000', u"[01000] [unixODBC][Driver Manager]Can't open lib 'FreeTDS' : file not found (0) (SQLDriverConnect)")

我希望在这方面提供一些帮助。 编辑:我已经在我的 dockerfile 中安装了它:

我已经在我的 dockerfile 中正确安装了驱动程序:

RUN echo "[FreeTDS]\n\
Description = FreeTDS unixODBC Driver\n\
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so\n\
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so" >> /etc/odbcinst.ini
RUN export PYMSSQL_BUILD_WITH_BUNDLED_FREETDS=1
RUN apt-get update && apt-get install -y unixodbc unixodbc-dev freetds-dev freetds-bin tdsodbc

【问题讨论】:

  • 你在 docker 之外试过这个吗?查看此错误详细说明的帖子:stackoverflow.com/questions/33158503/…
  • 在成功(我认为)安装 FreeTDS 之后,我的 docker 容器现在抛出了一个新错误。这是错误:pyodbc.OperationalError: ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect)')

标签: sql-server python-3.x docker pyodbc


【解决方案1】:

我通过像这样编辑/etc/odbcinst.ini 解决了这个问题:

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

根据您的架构,libtdsodbc.so 和 libtdsS.so 的路径可能会有所不同,正如链接问题中已经指出的那样。

如果对运行 docker 容器的路径有疑问,请进入 (docker exec -ti <hash> bash) 并搜索正确的路径。


根据您的操作系统和架构,您还可以使用 Microsoft ODBC 驱动程序而不是 FreeTDS 驱动程序。有关详细说明,请参阅docs

【讨论】:

  • 这让我更进一步,但我现在无法连接到实际的数据库。我通过 SSH 隧道连接了它,我可以从我的 SSMS 访问它,但实际上无法从 docker 容器内部的 pyodbc 连接。
  • 嗯,是的,这很棘手。这个问题可能会对您有所帮助:stackoverflow.com/questions/10056560/…。如果没有帮助,请随时就您的代码提出另一个问题以及确切的错误消息。
  • 微软帮助页面也不错,但是很详细:docs.microsoft.com/de-de/sql/database-engine/configure-windows/…
  • 我已经将 1433 从远程主机转发到 127.0.0.2:1433,并且它适用于 SSMS,所以我不确定它为什么不适用于我的 Docker 容器。我几乎尝试了TDS_VERSION 的所有版本,但无济于事。
  • 我正在像这样连接到我的服务器:pyodbc.connect(driver='{FreeTDS}', server='144.66.144.52\SQLEXPRESS', uid='sa', pwd='...')。如果您不确定连接字符串,您可以尝试通过 sqlcmd docs.microsoft.com/de-de/sql/relational-databases/scripting/… 进行连接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
相关资源
最近更新 更多