Невозможно подключиться к Microsoft SQL Server внутри контейнера Docker с помощью FreeTDS

Я хочу разместить приложения Shiny в сети моей компании с помощью Docker для Windows.

Как настроить файлы Docker, odbc.ini, odbcinst.ini, freetds.conf или, возможно, другие файлы, чтобы мое приложение Shiny могло запрашивать данные из внутренней базы данных Microsoft SQL Server (2016)? Сервер базы данных не работает на той же машине, на которой запущен контейнер Docker.

Я не знаю, нужна ли мне более новая версия FreeTDS или я неправильно настроил один из файлов. Я попытался использовать IP-адрес сервера вместо sql-server.host.com во всех файлах, но получил такое же сообщение об ошибке, как показано ниже.

Вывод $ tsql -C:

Compile-time settings (established with the "configure" script)
                            Version: freetds v1.00.104
             freetds.conf directory: /etc/freetds
     MS db-lib source compatibility: no
        Sybase binary compatibility: yes
                      Thread safety: yes
                      iconv library: yes
                        TDS version: 4.2
                              iODBC: no
                           unixodbc: yes
              SSPI "trusted" logins: no
                           Kerberos: yes
                            OpenSSL: no
                             GnuTLS: yes
                               MARS: no

Вывод $ odbcinst -j:

unixODBC 2.3.6
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

Вывод $ cat etc/odbcinst.ini:

[FreeTDS]
Description = FreeTDS unixODBC Driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

Вывод $ cat etc/odbc.ini:

[sql-server]
driver = FreeTDS
server = sql-server.host.com
port = 1433
TDS_Version = 4.2

Выход cat etc/freetds/freetds.conf$:

[sql-server]
host = sql-server.host.com
port = 1433
tds version = 4.2

Команда в R выдает ошибку:

con <- dbConnect(odbc::odbc(),
          driver = "FreeTDS",
          server = "sql-server.host.com",
          port = 1433,
          database = "database name",
          TDS_Version = 4.2)

Ошибка:

Error: nanodbc/nanodbc.cpp:950: 08001: [FreeTDS][SQL Server]Unable to connect to data source 
Execution halted

Файл Docker:

# Install R version 3.5.3
FROM r-base:3.5.3

# Install Ubuntu packages
RUN apt-get update && apt-get install -y \
    sudo \
    gdebi-core \
    pandoc \
    pandoc-citeproc \
    libcurl4-gnutls-dev \
    libcairo2-dev/unstable \
    libxt-dev \
    libssl-dev \
    unixodbc unixodbc-dev \
    freetds-bin freetds-dev tdsodbc

# Edit odbc.ini, odbcinst.ini, and freetds.conf files
RUN echo "[sql-server]\n\
host = sql-server.host.com\n\
port = 1433\n\
tds version = 4.2" >> /etc/freetds.conf

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

RUN echo "[sql-server]\n\
driver = FreeTDS\n\
server = sql-server.host.com\n\
port = 1433\n\
TDS_Version = 4.2" >> /etc/odbc.ini

# Install R packages that are required
RUN R -e "install.packages(c('shiny', 'DBI', 'odbc'), repos='http://cran.rstudio.com/')"

# copy the app to the image
RUN mkdir /root/shiny_example
COPY app /root/shiny_example

COPY Rprofile.site /usr/lib/R/etc/

# Make the ShinyApp available at port 801
EXPOSE 801

CMD ["R", "-e", "shiny::runApp('/root/shiny_example')"]

Команды сборки и запуска Docker:

docker build . -t shiny_example
docker run -it --network=host -p 801:801 shiny_example

Обратите внимание, что следующий код R работает на моем компьютере с Windows, на котором запущен контейнер Docker, и я могу успешно запросить базу данных:

library(DBI)
con <- dbConnect(odbc::odbc(),
          driver = "SQL server",
          server = "sql-server.host.com")

Вывод $ isql -v sql-server:

[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
[01000][unixODBC][FreeTDS][SQL Server]Unknown host machine name.
[ISQL]ERROR: Could not SQLConnect

Вывод $ tsql -S sql-server:

locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
Error 20013 (severity 2):
        Unknown host machine name.
There was a problem connecting to the server

person Giovanni Colitti    schedule 30.05.2019    source источник
comment
Похоже, вам нужно указать имя пользователя и пароль, если они еще не указаны на клиенте.   -  person Renat    schedule 30.05.2019
comment
Мне нужно указать имя пользователя и пароль в коде R? На моем компьютере с Windows мне не нужно указывать имя пользователя и пароль, поэтому я предполагаю, что он использует мое имя пользователя и пароль для входа в Windows, это правильно?   -  person Giovanni Colitti    schedule 30.05.2019
comment
Да, по умолчанию в SQL Server используется вход пользователя Windows через NTLM, а в Linux нет NTLM. Я не знаком с подключением к SQL Server из Linux, но мне кажется, что пользователь/пароль должен быть либо в odbc.ini, либо в freetds.conf   -  person Renat    schedule 30.05.2019
comment
На моем компьютере с Windows я использую проверку подлинности Windows. Нужно ли мне просить группу администраторов баз данных настроить другой тип аутентификации в SQL Server, чтобы я мог получить доступ к серверу базы данных из контейнера Docker? Я даже не знаю, каким должен быть мой логин или пароль.   -  person Giovanni Colitti    schedule 30.05.2019
comment
Возможно, мне нужен вход с использованием аутентификации SQL Server, как описано здесь: Документы Microsoft   -  person Giovanni Colitti    schedule 30.05.2019


Ответы (1)


Похоже, вы правы, но, возможно, немного пропустили. У меня была аналогичная проблема, но я смог ее исправить!

On python+mssqlserver+pymssql+docker(unbuntu16.04 base image)

Не исправляя конец, при запуске моего кода (с использованием pymssql) дал мне эта ошибка

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
  File "src/pymssql.pyx", line 645, in pymssql.connect
pymssql.InterfaceError: Connection to the database failed for an unknown reason.

Я вслед за создал 3 файла и скопировал их в образ!

  • Используйте myserver.orgName.com, где размещен сервер MSsql. docker/odbcinst.ini
[FreeTDS]
Description = v0.91 with protocol v7.3
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

docker/odbc.ini

[myserverdsn]
Driver = FreeTDS
Server = myserver.orgName.com
Port = 1433
TDS_Version = 7.3

docker/freetds.conf

[global]
    # TDS protocol version, use:
    # 7.3 for SQL Server 2008 or greater (tested through 2014)
    # 7.2 for SQL Server 2005
    # 7.1 for SQL Server 2000
    # 7.0 for SQL Server 7
    tds version = 7.2
    port = 1433

    # Whether to write a TDSDUMP file for diagnostic purposes
    # (setting this to /tmp is insecure on a multi-user system)
;   dump file = /tmp/freetds.log
;   debug flags = 0xffff

    # Command and connection timeouts
;   timeout = 10
;   connect timeout = 10

    # If you get out-of-memory errors, it may mean that your client
    # is trying to allocate a huge buffer for a TEXT field.
    # Try setting 'text size' to a more reasonable limit
    text size = 64512

# A typical Microsoft server
[myserverdsn]
    host = myserver.orgName.com
    port = 1433
    tds version = 7.3

Содержимое Dockerfile

RUN apt-get -y install unixodbc unixodbc-dev freetds-dev freetds-bin tdsodbc 

COPY freetds.conf /etc/freetds/freetds.conf
COPY odbc.ini /etc/odbc.ini
COPY odbcinst.ini /etc/odbcinst.ini

Протестируйте код Python, который работает:

python 
>>> import pymssql
>>> conn = pymssql.connect(server = 'myserver.orgName.com',
                   user = 'myusername',
                      password = 'mypassword',
                      database= 'mydbname')

работает без ошибок!

person Anu    schedule 19.06.2020