问题描述
我正在迁移本地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中执行端口转发...即使以root用户身份登录sql Server容器也无法执行此操作。 .iptables未安装,它不会让我apt-get install
吗?我还更新了Windows中的DTC选项,以使其尽可能打开,但没有任何效果。不知道秘密酱是什么。希望其他人也能使用类似的设置。
解决方法
感谢关于 msdtc
配置的提示,我已经开始使用这个组合:
version: '3.4'
services:
sqlserver:
image: mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
container_name: sqlserver
user: root
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=[yourPwd]
- MSSQL_RPC_PORT=135
- MSSQL_DTC_TCP_PORT=51000
ports:
- "1433:1433"
- "135:135"
- "51000:51000"
volumes:
- D:\DockerVolumes\sqlserver:/var/opt/mssql/data