【问题标题】:SQL Server 2017 for Docker does not work (because of missing ipv6?)Docker 的 SQL Server 2017 不起作用(因为缺少 ipv6?)
【发布时间】:2019-12-03 15:32:55
【问题描述】:

我正在开发一个 SQL Server 2017 Docker 容器。数据库永远不会启动。

我已自定义图像仅用于运行运行状况检查。不使用自定义的 Dockerfile 也会出现同样的问题。

主机已完全禁用 ipv6。 Docker 的daemon.json 有属性"ipv6" : false

Dockerfile(过期)

FROM mcr.microsoft.com/mssql/server:2017-latest-ubuntu

ENV ACCEPT_EULA=Y

EXPOSE 1433
HEALTHCHECK --interval=10s --timeout=3s --start-period=10s --retries=10 \
    CMD /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SA_PASSWORD} -Q "SELECT 1" || exit 1

日志

2019-12-03 15:10:44.73 spid19s     SQL Server could not spawn FRunCommunicationsManager thread. Check the SQL Server error log and the operating system error log for information about possible related problems.
2019-12-03 15:10:44.71 spid19s     Server failed to listen on 'any' <ipv6> 1433. Error: 0x2742. To proceed, notify your system administrator.
2019-12-03 15:10:44.71 spid19s     TDSSNIClient initialization failed with error 0x2742, status code 0xa. Reason: Unable to initialize the TCP/IP listener. A socket operation encountered a dead network. 
2019-12-03 15:10:44.72 spid19s     TDSSNIClient initialization failed with error 0x2742, status code 0x1. Reason: Initialization failed with an infrastructure error. Check for previous errors. A socket operation encountered a dead network. 
2019-12-03 15:10:44.71 spid19s     Error: 26024, Severity: 16, State: 1.
2019-12-03 15:10:44.71 spid19s     Error: 17182, Severity: 16, State: 1.
2019-12-03 15:10:44.72 spid19s     Error: 17182, Severity: 16, State: 1.
2019-12-03 15:10:44.72 spid19s     Error: 17826, Severity: 18, State: 3.
2019-12-03 15:10:44.72 spid19s     Could not start the network library because of an internal error in the network library. To determine the cause, review the errors immediately preceding this one in the error log.
2019-12-03 15:10:44.73 spid19s     Error: 17120, Severity: 16, State: 1.

我曾尝试直接在容器上运行sysctl 以显式禁用 ipv6,但似乎不需要。

$ sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl: cannot stat /proc/sys/net/ipv6/conf/all/disable_ipv6: No such file or directory

问题:我该如何解决这个问题?问题真的与 ipv6 dis 连接有关吗? 有什么方法可以告诉mssql 不要尝试使用 ipv6?

更新

我已经尝试了以下 Dockerfile

FROM mcr.microsoft.com/mssql/server:2017-latest-ubuntu

ENV MSSQL_IP_ADDRESS=0.0.0.0
ENV ACCEPT_EULA=Y
ENV MSSQL_PID=Express
RUN MSSQL_IP_ADDRESS=0.0.0.0 /opt/mssql/bin/mssql-conf setup
EXPOSE 1433
HEALTHCHECK --interval=10s --timeout=3s --start-period=10s --retries=10 \
    CMD /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P ${SA_PASSWORD} -Q "SELECT 1" || exit 1

错误是

Building image...
Preparing build context archive...
[==================================================>]2/2 files
Done

Sending build context to Docker daemon...
[==================================================>]  566,0B
Done

Step 1/7 : FROM mcr.microsoft.com/mssql/server:2017-latest-ubuntu
 ---> cfe5615bf6a8
Step 2/7 : ENV MSSQL_IP_ADDRESS=0.0.0.0
 ---> Running in d65d0c977ea1
Removing intermediate container d65d0c977ea1
 ---> 358ed84b0ae7
Step 3/7 : ENV ACCEPT_EULA=Y
 ---> Running in b0a6b46edb0a
Removing intermediate container b0a6b46edb0a
 ---> ed69c043b383
Step 4/7 : ENV MSSQL_PID=Express
 ---> Running in e58a9930791c
Removing intermediate container e58a9930791c
 ---> 94f055e34ba0
Step 5/7 : RUN MSSQL_IP_ADDRESS=0.0.0.0 /opt/mssql/bin/mssql-conf setup
 ---> Running in 508cacc5158a
Traceback (most recent call last):
  File "/opt/mssql/bin/../lib/mssql-conf/mssql-conf.py", line 279, in <module>
    main()
  File "/opt/mssql/bin/../lib/mssql-conf/mssql-conf.py", line 275, in main
    processCommands()
  File "/opt/mssql/bin/../lib/mssql-conf/mssql-conf.py", line 199, in processCommands
    COMMAND_TABLE[args.which]()
  File "/opt/mssql/bin/../lib/mssql-conf/mssql-conf.py", line 54, in handleSetup
    exit(mssqlconfhelper.setupSqlServer(eulaAccepted, noprompt=args.noprompt))
  File "/opt/mssql/lib/mssql-conf/mssqlconfhelper.py", line 795, in setupSqlServer
    if not checkInstall():
  File "/opt/mssql/lib/mssql-conf/mssqlconfhelper.py", line 765, in checkInstall
    return runScript(checkInstallScript, True) == 0
  File "/opt/mssql/lib/mssql-conf/mssqlconfhelper.py", line 754, in runScript
    return subprocess.call([sudo, "-EH", pathToScript])
  File "/usr/lib/python2.7/subprocess.py", line 523, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
Error response from daemon: The command '/bin/sh -c MSSQL_IP_ADDRESS=0.0.0.0 /opt/mssql/bin/mssql-conf setup' returned a non-zero code: 1

【问题讨论】:

    标签: docker sql-server-2017-express


    【解决方案1】:

    这似乎是一个记录在案的问题,您可以通过搜索错误找到:

    Server failed to listen on 'any' <ipv6> 1433. Error: 0x2742
    

    这会将您带到文档:Mssql-conf tool fails if IPV6 is disabled on the Linux system,其中描述了问题:

    症状

    假设您尝试在 Linux 上安装 Microsoft SQL Server 2017 操作系统,例如 Redhat 或 Ubuntu。如果 IPv6 在 操作系统内核级别,并且您尝试使用 “sudo /opt/mssql/bin/mssql-conf setup”命令,您会收到 Linux 控制台和 SQL Server 错误日志中的以下消息。 此外,配置可能会失败。

    我们可以在上面提到的错误日志中看到你描述的错误:

    SQL Server 错误日志:

     ...
     DateTimeAndSpid     Error: 26024, Severity: 16, State: 1.​
     DateTimeAndSpid     Server failed to listen on 'any' <ipv6> 1433. Error: 0x2742. To proceed, notify your system administrator.​
     DateTimeAndSpid     Error: 17182, Severity: 16, State: 1.​
     DateTimeAndSpid     TDSSNIClient initialization failed with error 0x2742, status code 0xa. Reason: Unable to initialize the TCP/IP listener. A socket operation encountered a dead network.​
     DateTimeAndSpid     Error: 17182, Severity: 16, State: 1.​
     DateTimeAndSpid     TDSSNIClient initialization failed with error 0x2742, status code 0x1. Reason: Initialization failed with an infrastructure error. Check for previous errors. A socket operation encountered a dead network.​
     ...
    

    并提供解决方法:

    解决方法

    要解决此问题,请运行以下命令:

    sudo MSSQL_IP_ADDRESS=0.0.0.0 /opt/mssql/bin/mssql-conf setup
    

    目前,除了指定上述解决方法(这可能是因为它是“设计”的)之外,微软似乎并未努力“避免”该错误:

    状态

    Microsoft 已确认这是 Microsoft 中的问题 “适用于”部分中列出的产品。

    【讨论】:

    • 也许我应该在我的 Dockerfile 中这样做。感谢您的大力帮助。我会试试的
    • @usr-local-ΕΨΗΕΛΩΝ,您可以在 dockerfile 或运行命令中设置环境变量 MSSQL_IP_ADDRESS=0.0.0.0
    • @DanGuzman 不,没用。我不确定mssql-conf setup 做了什么,但确实它是在较早的层中执行的。当您在 Dockerfile 中设置 ENV 变量时,它将仅在最外层设置。例如,MSSQL 可能已经在某处的某个配置中硬编码了 ::0,并且需要再次运行该脚本
    • 并且记录RUN MSSQL_IP_ADDRESS=0.0.0.0 /opt/mssql/bin/mssql-conf setup没有工作,由于无法在comment中显示的Python错误,构建失败
    • Python 错误? SQL Server 不在 python 中运行。这听起来不像你正确地运行了命令,@usr-local-ΕΨΗΕΛΩΝ。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多