Docker部署SQL Server容器SA登录失败及自定义用户需求
一、SSMS连接容器内SQL Server sa登录失败的排查与解决
本地SQL Server的sa密码和容器内实例完全独立,不会互相影响,无需怀疑该因素。以下是常见问题及解决步骤:
检查端口映射配置
确保docker-compose.yml中SQL Server的端口映射正确,避免和本地SQL Server默认的1433端口冲突。例如:ports: - "1401:1433"SSMS连接时,服务器名称需填写
localhost,1401或你的本机IP,1401,而非默认的localhost(会指向本地SQL Server实例)。验证容器内sa密码正确性
进入容器终端,用sqlcmd确认密码有效:docker exec -it 你的容器名 sqlcmd -S localhost -U sa -P 容器sa密码若能正常登录,需确保SSMS中输入的密码与该密码完全一致,注意大小写、特殊字符的输入准确性。
确认sa账户状态
在容器终端的sqlcmd中执行以下语句,检查sa账户是否启用:SELECT name, is_disabled FROM sys.server_principals WHERE name = 'sa'; GO若
is_disabled值为1,执行以下命令启用并重置密码:ALTER LOGIN sa ENABLE; GO ALTER LOGIN sa WITH PASSWORD = '你的容器sa密码'; GO检查防火墙规则
临时关闭Windows防火墙测试连接,若能成功,需在防火墙中添加允许映射端口(如1401)的入站规则。
二、在docker-compose.yml中创建自定义用户FithubDBUser
可以通过挂载初始化脚本的方式,在容器首次启动时自动创建用户并分配权限,步骤如下:
编写初始化脚本(init-db.sql)
创建包含用户创建和权限分配的SQL脚本,示例如下:-- 创建服务器登录账户 CREATE LOGIN FithubDBUser WITH PASSWORD = '你的自定义密码'; GO -- 切换到目标数据库 USE Fithub; GO -- 创建数据库用户 CREATE USER FithubDBUser FOR LOGIN FithubDBUser; GO -- 分配Fithub数据库的最高权限(db_owner角色,等同于该数据库的sys权限) ALTER ROLE db_owner ADD MEMBER FithubDBUser; GO若需服务器级sysadmin权限(不推荐,除非必要),可添加:
ALTER SERVER ROLE sysadmin ADD MEMBER FithubDBUser; GO修改docker-compose.yml挂载脚本
将脚本挂载到容器的初始化目录,配置示例:version: '3.8' services: sqlserver: image: mcr.microsoft.com/mssql/server:2017-latest environment: - ACCEPT_EULA=Y - SA_PASSWORD=你的容器sa密码 - MSSQL_PID=Developer ports: - "1401:1433" volumes: - ./init-db.sql:/docker-entrypoint-initdb.d/init-db.sql # 可选:添加数据卷持久化SQL Server数据 - sqlserver-data:/var/opt/mssql volumes: sqlserver-data:注:
/docker-entrypoint-initdb.d/目录下的SQL脚本会在容器首次启动时自动执行,确保主机上的init-db.sql与docker-compose.yml在同一目录。
内容的提问来源于stack exchange,提问作者GKhedekar

