如何在现有的Docker容器中启用SQL Server Agent

13
我在Docker上运行了一个SQL Server镜像,但是我需要启用SQL Server Agent来运行一些作业,但我没有成功。主要问题是容器有相当多的数据库和需要维护的设置。命令“docker run -e”MSSQL_AGENT_ENABLED=true...“”对我没用,因为它会创建一个新的容器,我会失去当前的配置。
我使用了以下命令来启用接口,但在运行作业时,我得到一个错误,说SQL Server Agent没有启用。
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Agent XPs',1
reconfigure 

执行作业时出现的错误如下:

执行 Transact-SQL 语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo) SQLServerAgent 目前未运行,因此无法通知该操作。(Microsoft SQL Server, Error: 22022)

我尝试使用命令 EXEC xp_servicecontrol N'START ', N'SQLServerAGENT' 启动 SQL Server Agent,但它会生成另一个错误。

StartService() 返回错误 1053,“服务未能及时响应启动或控制请求。”

问题是,如何在已经运行的容器中启用 SQL Server Agent,以便能够安排作业。

1
创建一个新的容器是打补丁SQL Server的唯一方法。所以你也应该在这里这样做。 - David Browne - Microsoft
StartService错误1053是Windows服务控制管理器错误。您确定已连接到Docker容器内的SQL Server吗? - AlwaysLearning
3个回答

22

如果您已经使用类似 SQL Server 2019 Developer 版本创建了 Docker 容器:

$ docker run -e ACCEPT_EULA=Y -e MSSQL_PID=Developer -e MSSQL_SA_PASSWORD=YourStrongPassw0rd -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
57301203bac57455a118e0dbe6ff392cb19313375c134050e6ecd77414555e7e

参考使用mssql-conf工具在Linux上配置SQL Server,在容器中获取root shell:

$ docker exec -it --user root 57301203bac5 bash

然后在配置文件中启用SQL Agent并重新启动SQL Server服务:

root@57301203bac5:/# /opt/mssql/bin/mssql-conf set sqlagent.enabled true
SQL Server needs to be restarted in order to apply this setting. Please run
'systemctl restart mssql-server.service'.

root@57301203bac5:/# systemctl restart mssql-server.service

如果您收到类似于systemctl: command not found的错误消息,则只需停止并重新启动容器,以使更改生效。


9

按照以下步骤,从容器外部进入终端:

sudo docker exec -it --user root sql1 "bash"

该密码不会与容器相关。

接下来将自己提升为超级用户:

su -

接下来,通过更改配置文件启用sqlagent:

/opt/mssql/bin/mssql-conf set sqlagent.enabled true

现在输入 exit 退出容器,先退出 root 用户,再退出容器。

exit
exit

最后重新启动包含您的 Microsoft SQL Server 实例的 Docker 容器

(在本例中标记为 sql1)

docker restart sql1

注意,在 SQL Management Studio 中,您需要右键单击 SQL Server Agent 图标并刷新以验证其是否已启动。

SQL SERVER AGENT

请注意,如果在初始化容器时启用了 SQL Server Agent 标志,则无需执行此操作:

docker run -d -p 1433:1433 --env ACCEPT_EULA=Y --env SA_PASSWORD='MYSUP3RS@!3' --env MSSQL_AGENT_ENABLED=True --name sql1 mcr.microsoft.com/mssql/server:2019-GDR1-ubuntu-16.04 

2
"su" 命令要求输入未知密码。 - alejandrob
是的,这将是主机的“根”密码。 - navarq
我按照这个步骤进行操作,包括在compose脚本环境值列表中使用MSSQL_AGENT_ENABLED的替代方法。在SMSS中,代理图标显示为一个微小的半像素大小的绿点,我需要更强的眼镜才能看清楚,但是没有成功。代理服务无法启动。尝试启动作业时出现22022 SQLServerAgent当前未运行的错误...容器日志中没有相关信息。 - Cee McSharpface
解析:实例名称(主机名)不能超过15个字符。谁能想到呢。https://stackoverflow.com/a/66971139/1132334 - Cee McSharpface
这个链接帮助我以root用户身份登录运行中的SQL Server容器,从而避免了需要输入密码的需求。 - undefined

0
对于使用Docker Compose的任何人来说,只需在yaml环境中添加一个标志就更容易了。
environment:
  MSSQL_AGENT_ENABLED: true

然后只需再次向下和向上滚动容器。
更多信息请访问Microsoft.com。
感谢Mickeybyte的贡献:https://stackoverflow.com/a/76182745

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接