sql-server - 无法调试 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.
这告诉我们一些重要信息:
- 我们知道文件路径是正确的,因为我们将它们放在
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 容器应该成功启动时。
推荐阅读
- node.js - Node.js - 通过流将文件从 FTP A 复制到 FTP B
- css - 样式在开发期间未应用于 vue Web 组件
- .net - 公共交通测试线束
- ios - 如何使用 readline 在 switch 中创建循环
- javascript - 获取文档的值
- javascript - 如何判断 html 字符串是否包含内容而不仅仅是标签
- java - 404 Not Found Spring Boot application using spring cloud starter security
- mysql - 将多个结果合并为列
- python - 填写后如何使用selenium python提交角度表单
- r - 未嵌套分组的平均值的总和