首页 > 解决方案 > 无法调试 SQL Server Docker 容器 SSL 证书问题

问题描述

我有一个 SQL Server 2019 容器,我正在尝试按照此处概述的步骤设置 SSL 证书。 但是当我用 运行容器时docker run,它会旋转一些,然后出错:

无法初始化用户指定的证书配置。服务器正在关闭。验证证书是否配置正确。

容器在此时突然终止。因此,我尝试连接到 shell 进行调试,方法是使用标志旋转容器,-d然后连接docker exec -it [name] "bash". 但我只有片刻时间在容器内闲逛,因为显然上述过程仍在继续,它很快出错,关闭,并将容器从我下面拉出来。

我从中派生这项工作的基本容器是mcr.microsoft.com/mssql/server:2019-latest. 有没有办法获得无限的时间来调试这个证书问题?

标签: sql-serverdocker

解决方案


首先查看容器日志。例如,如果您的数据库容器是sql2019从主机调用的,那么您可能会发出类似于:

# docker logs sql2019
...
2021-05-12 13:09:14.47 spid26s     Error: 49940, Severity: 16, State: 1.
2021-05-12 13:09:14.47 spid26s     Unable to open one or more of the user-specified certificate file(s). Verify that the certificate file(s) exist with read permissions for the user and group running SQL Server.
2021-05-12 13:09:14.56 spid26s     Error: 49939, Severity: 16, State: 1.
2021-05-12 13:09:14.56 spid26s     Unable to initialize user-specified certificate configuration. The server is being shut down. Verify that the certificate is correctly configured. Error[30]. State[51].
...
db exited with code 1
db   | SQL Server 2019 will run as non-root by default.
db   | This container is running as user mssql.
db   | Your master database file is owned by mssql.
db   | To learn more visit https://go.microsoft.com/fwlink/?linkid=2099216.

这告诉我们一些重要信息:

  • 我们知道文件路径是正确的,因为我们将它们放在Dockerfile文件mssql.conf中。
  • 我们知道权限可能是一个问题,因为错误消息中提到了它们。
  • 我们知道 SQL Server 服务正在与用户一起运行,mssql因此我们需要允许这样做。

在你的Dockerfile你可能有类似于以下的行:

COPY ./mssql.pem /etc/ssl/certs/mssql.pem
COPY ./mssql.key /etc/ssl/private/mssql.key
COPY ./mssql.conf /var/opt/mssql/mssql.conf

暂时注释掉该mssql.conf行并docker up再次注释(没有配置文件):

COPY ./mssql.pem /etc/ssl/certs/mssql.pem
COPY ./mssql.key /etc/ssl/private/mssql.key
# COPY ./mssql.conf /var/opt/mssql/mssql.conf

随着容器的运行,您可以获得 CLI 来检查/etc/ssl文件夹中的权限...

# ls -la /etc/ssl
total 32
drwxr-xr-x 1 root root  4096 Apr  3 03:26 .
drwxr-xr-x 1 root root  4096 May 12 13:34 ..
drwxr-xr-x 1 root root  4096 May 12 13:34 certs
-rw-r--r-- 1 root root 10909 Mar 22 11:37 openssl.cnf
drwx------ 1 root root  4096 May 12 13:34 private

请注意,该/etc/ssl/private文件夹归用户所有root,只能由root用户访问。这些权限将阻止mssql用户读取/etc/ssl/private/mssql.key文件。

更新您的Dockerfile以使/etc/ssl/private文件夹可访问:

COPY ./mssql.pem /etc/ssl/certs/mssql.pem
COPY ./mssql.key /etc/ssl/private/mssql.key
COPY ./mssql.conf /var/opt/mssql/mssql.conf
USER root
RUN chmod 755 /etc/ssl/private
USER mssql

现在,当您docker up的 SQL Server 容器应该成功启动时。


推荐阅读