You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS应用部署到Docker容器后无法连接SQL Server问题求助

问题排查与解决方案

根本原因

  1. 端口显示undefined的配置冲突:你在数据库连接配置中同时指定了instanceName和静态端口1433,mssql的tedious驱动在检测到instanceName配置后,会优先向SQL Server Browser服务的1434 UDP端口请求实例对应的动态端口,忽略你手动指定的port参数,若无法访问1434端口就会出现端口undefined的报错。
  2. TLS握手失败的核心问题:你使用的node:latest镜像默认基于Debian 12及以上版本,系统默认禁用了大量旧版TLS密码套件,而你部署的SQL Server版本较旧,仅支持旧版密码套件,两端支持的套件无交集导致TLS协商失败,对应SQL Server日志中的错误码40、状态1205。
  3. Dockerfile语法错误:你写的CMD [run, script, release]缺少npm命令和参数引号,正确格式应为CMD ["npm", "run", "release"]。

修复步骤

第一步:修复数据库连接配置(二选一即可)

  • 若使用静态端口连接:删除配置中server字段的\\INSTANCE后缀,同时删除options下的instanceName配置,保留port=1433即可,避免驱动尝试解析实例端口。
  • 若必须使用实例名:确保Docker容器可以访问SQL Server所在服务器的1434 UDP端口,删除连接配置中根层级重复的port:1433配置,仅保留options内的端口配置即可。

第二步:修复TLS密码套件不匹配问题(二选一即可)

  • 方案A:更换兼容的Node基础镜像,将FROM node:latest替换为FROM node:18-bullseye-slim,该镜像基于Debian 11,默认保留了旧版TLS密码套件,可直接兼容老版本SQL Server。
  • 方案B:保留现有基础镜像,修改启动参数,在你的release启动脚本中给node命令加TLS配置,示例:
    "scripts": {
      "release": "node --tls-cipher-list \"DEFAULT@SECLEVEL=0\" 你的入口文件路径.js"
    }
    

第三步:优化Dockerfile

删除不必要的EXPOSE 1433配置,EXPOSE是声明容器本身要监听的端口,你主动访问外部SQL Server的1433端口不需要暴露容器自身的端口。

内容的提问来源于stack exchange,提问作者Ash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:09:01