【发布时间】:2020-11-09 04:11:09
【问题描述】:
我正在迁移本地 SQL Server 开发数据库以在 Linux docker 容器中运行(在同一台开发机器上)。在 Windows 上的 Visual Studio 2019 中运行我的集成测试时,我收到 MSDTC 错误:
抛出异常: 'System.Transactions.TransactionManagerCommunicationException' 在 System.Data.dll 类型异常 'System.Transactions.TransactionManagerCommunicationException' 发生在 System.Data.dll 中但未在用户代码中处理 与底层事务管理器的通信失败。
这是我在 docker-compose 中的最新 SQL Server 迭代:
services:
sqlserver:
image: mcr.microsoft.com/mssql/server:2019-latest
container_name: SqlServer
restart: always
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=verySecretPassword
- MSSQL_RPC_PORT=13500
- MSSQL_DTC_TCP_PORT=51000
ports:
- "1401:1433"
- "135:13500"
- "51000:51000"
volumes:
- sqldata:/var/opt/mssql
我已经尝试了各种方法来调整 RPC 端口以使其正常工作。 This is the main MS article。我试过端口135:135,但它给出了同样的错误。底部文章中的注释似乎与我的问题有关。
对于容器外的 SQL Server 或非根容器,一个 容器中必须使用不同的临时端口,例如 13500 然后必须将到端口 135 的流量路由到该端口。你会 还需要从容器内配置端口路由规则 容器端口 135 到临时端口。
此外,如果您决定将容器的端口 135 映射到不同的 主机上的端口,比如13500,那么你要配置端口 主机上的路由。这使得 docker 容器能够参与 在与主机和其他外部的分布式事务中 服务器。
SQL Server 2019 容器以非 root 用户身份运行。我已经尝试在 Windows 中使用 netsh 进行端口路由......还有 MS 文章链接到如何在 Ubuntu 中执行端口转发......即使在 SQL Server 容器中以 root 身份登录我也无法做到...... .iptables没有安装,它不让我apt-get install呢??我还更新了 Windows 中的 DTC 选项,使其尽可能打开,但没有任何效果。不知道秘方是什么。希望其他人也有类似的设置。
【问题讨论】:
标签: sql-server docker docker-compose msdtc sql-server-linux