我试图在使用Docker托管的SQL Server 2017数据库上使用pyodbc执行表创建。我也在使用网络,以便以后可以从另一个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

我也尝试添加
-h "mssqldocker"

转到运行Docker镜像的命令,然后使用“mssqldocker”而不是localhost,但无济于事,因为不匹配的主机名似乎是同时使用DB和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>

最佳答案

docker run命令中,指定-p 7000:7000。这表示“将主机端口7000(第一个7000-已发布)映射到容器端口7000(第二个7000-已公开)”。如果MSSQL在容器内的其他端口上运行(可能是这样),则必须将第二个7000更改为正确的端口。

完成后,您应该可以使用“localhost:7000”从主机连接到MSSQL。如果您的python应用程序直接在主机上运行,则适用。

如果您的python项目也运行在容器中,则需要确保它与mssql容器(--network=lambda-local-mssql)在同一网络上运行,然后需要使用“mssqldocker:mssql_exposed_port”进行连接。在这种情况下,本地主机和7000(-p 7000:...的第一部分)不再有效,因为您位于docker管理的网络上。

08-27 15:34