MSSQL Docker报BootstrapSystemDataDirectories() 0x8007010b错误解决
问题场景
尝试将SQL Server的MDF、LDF数据库文件挂载到mssql/server:2019-latest Docker容器中,初始Dockerfile配置如下:
FROM mcr.microsoft.com/mssql/server:2019-latest ENV ACCEPT_EULA=Y ENV SA_PASSWORD=Str0ngP@ssw0rd! ENV MSSQL_TCP_PORT=1433 EXPOSE 1433 COPY mydb.mdf /var/opt/mssql/data/mydb.mdf COPY mydb_log.ldf /var/opt/mssql/data/mydb_log.ldf ENTRYPOINT /opt/mssql/bin/sqlservr
问题现象
本地目录结构为同文件夹存放Dockerfile、mydb.mdf、mydb_log.ldf三个文件,运行环境为Windows 10工作站、Docker Desktop 4.5.1。
镜像可正常构建,但只要Dockerfile中包含上述两条COPY指令,运行容器时就会抛出错误:ERROR: BootstrapSystemDataDirectories() failure (HRESULT 0x8007010b);移除COPY指令后容器可正常启动。报错时额外提示无法将c:\tempdata\master.mdf复制到容器内/var/opt/mssql/data/master.mdf路径。
问题原因
Dockerfile中的COPY指令默认以容器root用户执行,会导致/var/opt/mssql目录所有权被root占用,运行SQL Server服务的mssql用户无目录操作权限。
解决方案
- 编写数据库附加脚本
attach-db.sh,等待SQL Server启动完成后自动执行附加命令:
sleep 15s /opt/mssql-tools/bin/sqlcmd -S . -U sa -P $tr0ngP@ssw0rd! -Q "CREATE DATABASE [mydb] ON (FILENAME = '/var/opt/mssql/data/mydb.mdf'),(FILENAME = '/var/opt/mssql/data/mydb_log.ldf') FOR ATTACH"
- 调整Dockerfile,复制数据库文件与附加脚本到容器内,将
/var/opt/mssql目录权限归属修改为mssql用户,启动时同时运行附加脚本与sqlservr服务:
FROM mcr.microsoft.com/mssql/server:2019-latest ENV ACCEPT_EULA=Y ENV SA_PASSWORD=$tr0ngP@ssw0rd! COPY mydb.mdf /var/opt/mssql/data/mydb.mdf COPY mydb_log.ldf /var/opt/mssql/data/mydb_log.ldf COPY attach-db.sh /var/opt/mssql/data/attach-db.sh RUN chown -R mssql:mssql /var/opt/mssql ENTRYPOINT /var/opt/mssql/data/attach-db.sh & /opt/mssql/bin/sqlservr
- 构建镜像后执行以下命令启动容器,安装Azure Data Studio即可连接容器内的数据库实例:
docker run -p 1433:1433 --hostname mydb myimage
内容的提问来源于stack exchange,提问作者Will Marcouiller
相关产品推荐
相关产品推荐

