Подключение сервера SQL на Docker к Python - PullRequest
3 голосов
/ 14 февраля 2020

Я пытаюсь создать таблицу с помощью pyodb c в базе данных SQL Server 2017, размещенной с использованием Docker. Я также использую сеть, чтобы потом подключиться к ней из другого Docker образа. Тем не менее, я получаю следующую ошибку

pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')

Вот так я и создал соединение.

Чтобы создать и запустить сервер БД,

docker run --name mssqldocker -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<password>' -e 'MSSQL_PID=Express' -p 7000:7000 --network=lambda-local-mssql -v <my_path> -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu

I также попытался добавить

-h "mssqldocker"

в команду для запуска образа Docker и затем использовать «ms sqldocker» вместо localhost, но безрезультатно, поскольку несоответствующие имена хостов, по-видимому, являются повторяющаяся тема при использовании БД и Docker вместе. Также попытался добавить в \sqlexpress без эффекта. Код Python выглядит следующим образом:

import pyodbc
import sql_clauses
from settings import ENDPOINT, PORT, USERNAME, PASSWORD

cnxn = pyodbc.connect(
       'DRIVER={ODBC Driver 17 for SQL Server}' + 
       ';SERVER=' + ENDPOINT + ';UID=' + USERNAME + 
       ';PWD=' + PASSWORD)

cursor = db.cursor()
cursor.execute(create_database(dbname))
cnxn.commit()
cnxn.close()
print("Database created")

Файл настроек имеет следующий вид:

ENDPOINT="localhost"
PORT = 7000
USERNAME="SA"
PASSWORD=<password>

1 Ответ

3 голосов
/ 14 февраля 2020

В вашей команде docker run вы указываете -p 7000:7000. Это переводится как «сопоставить порт хоста 7000 (первый 7000 - опубликован) с портом контейнера 7000 (второй 7000 - открыт)». Если у вас MS SQL, работающий на другом порту внутри вашего контейнера (что, вероятно, у вас), вам нужно заменить второй 7000 на правильный порт.

Как только вы это сделаете, вы сможете подключиться на MS SQL с хоста, используя "localhost: 7000". Это применимо, если ваше python приложение запускается напрямую на хосте .

Если ваш python проект также работает в контейнере , вам необходимо убедиться, что оно выполняется в той же сети, что и контейнер ms sql (--network=lambda-local-mssql), а затем вам необходимо подключиться, используя "ms sqldocker: mssql_exposed_port". В этом случае localhost и 7000 (первая часть `-p 7000: ...) больше не действительны, так как вы находитесь в docker управляемой сети.

...