我有一个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.
这告诉我们一些重要信息:
- 我们知道文件路径是正确的,因为我们把它们放在了
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容器应该会成功启动。