无法调试SQL Server Docker容器SSL证书问题



我有一个SQL Server 2019容器,我正在尝试使用SSL证书进行设置,步骤如下。但是,当我用docker run运行容器时,它会有点旋转,然后出错:

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

容器此时突然终止。因此,我尝试连接到一个shell进行调试,方法是使用-d标志旋转容器,然后连接docker exec -it [name] "bash"。但我只有几分钟的时间在集装箱里摸索,因为显然上面描述的过程仍在继续,它很快出错,关闭,并从我下面把集装箱拉出。

我从mcr.microsoft.com/mssql/server:2019-latest中派生出这项工作的基本容器。是否有任何方法可以获得无限制的时间来调试此证书问题?

从查看容器日志开始。例如,如果您的数据库容器名为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.

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

  • 我们知道文件路径是正确的,因为我们把它们放在了Dockerfilemssql.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容器应该会成功启动。

最新更新