将数据库部署到 Docker 容器 microsoft/mssql-server-linux
Deploy the database to Docker Container microsoft/mssql-server-linux
我在 Windows 的 SQL 服务器 (13.01) 上有一个数据库 运行。我喜欢使用 SSDT 将它部署到 Linux 上的 Docker 容器。
我可以完美地手动连接到 Docker 和 create/drop 数据库上的服务器 运行 并使用数据。
问题是我无法发布它。我正在 Powershell
上执行以下脚本
PS: SqlPackage.exe /Action:Publish /SourceFile:"d.dacpac" /TargetConnectionString:"server=containeraddress;database=thedatabase;user id=sa;password=thepassword;
并出现以下错误。
Unable to connect to master or target server 'the database'. You must have a user with the same password in master or target server 'the database'. (Microsoft.Data.Tools.Schema.Sql)
我在目标服务器和源服务器上拥有相同的用户名和相同的密码。
有没有人遇到同样的问题并知道如何解决?
您使用的 SqlPackage.exe 是哪个版本?只有 SqlPackage.exe 的最新发布候选版本支持 SQL Server vNext CTP。可以在此处下载 SqlPackage 候选版本:https://www.microsoft.com/en-us/download/details.aspx?id=54273
我会在这里 post 因为大多数答案都指的是有一个现有的编译 dacpac 文件,这可能并不总是可能的。我还没有在其他地方看到与我在这里建议的解决方案类似的想法 post。
考虑到您对 docker 的使用,并且如果您希望在容器内编译 visual studio 项目,考虑到容器基础 OS 和图像的某些组合可能无法使用 msbuild 创建一个 dacpac 文件。
您可以使用一系列基于 unix 的命令来恢复数据库,注意 visual studio 数据库项目通常只是一系列 SQL 文件,下面我展示了一个示例在这里,我将 SQL 文件合并到一个文件中,然后调用 sqlcmd 到 运行 脚本;
FROM mcr.microsoft.com/mssql/server
WORKDIR /init
ENV ACCEPT_EULA=Y
ENV MSSQL_SA_PASSWORD=MyPassword
EXPOSE 1433:1433
RUN apt-get update && apt-get install dos2unix
COPY /solution_folder/database/Tables/*.sql /init/
WORKDIR /database
RUN echo "CREATE DATABASE [database_name];\nGO\nUSE [database_name];\n” >> /database/create.sql
RUN for f in /init/*.sql; do dos2unix $f; cat $f >> /database/create.sql; echo "\nGO\n" >> /database/create.sql; done
RUN ( /opt/mssql/bin/sqlservr --accept-eula & ) | grep -q "Service Broker manager has started" && /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ‘MyPassword’ -i /database/create.sql && pkill sqlservr
"dos2unix" 的原因是在 visual studio 中创建的 SQL 文件具有独特的隐藏 cr/lf(和其他字符),linux 版本sqlcmd 不会成功解释并会导致错误(这有点奇怪,而这正是您希望跨平台数据库能够处理的事情)
此外,在最后的 运行 命令中,您必须暂时启动 sql 服务器服务,否则您也会遇到错误;这是一些变通办法,有点繁琐,我不完全确定微软 sql 服务器 linux 容器是否设计得足够好,可以完成像这样恢复数据库的简单任务,细微差别是构建和 运行 构建容器之间的差异,并且需要两种概念的某种快乐中间地带才能工作。
这里给出的不是完整的恢复解决方案,它只处理项目文件中的表,尽管扩展到标量函数和存储过程应该是微不足道的。
我在 Windows 的 SQL 服务器 (13.01) 上有一个数据库 运行。我喜欢使用 SSDT 将它部署到 Linux 上的 Docker 容器。
我可以完美地手动连接到 Docker 和 create/drop 数据库上的服务器 运行 并使用数据。
问题是我无法发布它。我正在 Powershell
上执行以下脚本PS: SqlPackage.exe /Action:Publish /SourceFile:"d.dacpac" /TargetConnectionString:"server=containeraddress;database=thedatabase;user id=sa;password=thepassword;
并出现以下错误。
Unable to connect to master or target server 'the database'. You must have a user with the same password in master or target server 'the database'. (Microsoft.Data.Tools.Schema.Sql)
我在目标服务器和源服务器上拥有相同的用户名和相同的密码。
有没有人遇到同样的问题并知道如何解决?
您使用的 SqlPackage.exe 是哪个版本?只有 SqlPackage.exe 的最新发布候选版本支持 SQL Server vNext CTP。可以在此处下载 SqlPackage 候选版本:https://www.microsoft.com/en-us/download/details.aspx?id=54273
我会在这里 post 因为大多数答案都指的是有一个现有的编译 dacpac 文件,这可能并不总是可能的。我还没有在其他地方看到与我在这里建议的解决方案类似的想法 post。
考虑到您对 docker 的使用,并且如果您希望在容器内编译 visual studio 项目,考虑到容器基础 OS 和图像的某些组合可能无法使用 msbuild 创建一个 dacpac 文件。
您可以使用一系列基于 unix 的命令来恢复数据库,注意 visual studio 数据库项目通常只是一系列 SQL 文件,下面我展示了一个示例在这里,我将 SQL 文件合并到一个文件中,然后调用 sqlcmd 到 运行 脚本;
FROM mcr.microsoft.com/mssql/server
WORKDIR /init
ENV ACCEPT_EULA=Y
ENV MSSQL_SA_PASSWORD=MyPassword
EXPOSE 1433:1433
RUN apt-get update && apt-get install dos2unix
COPY /solution_folder/database/Tables/*.sql /init/
WORKDIR /database
RUN echo "CREATE DATABASE [database_name];\nGO\nUSE [database_name];\n” >> /database/create.sql
RUN for f in /init/*.sql; do dos2unix $f; cat $f >> /database/create.sql; echo "\nGO\n" >> /database/create.sql; done
RUN ( /opt/mssql/bin/sqlservr --accept-eula & ) | grep -q "Service Broker manager has started" && /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ‘MyPassword’ -i /database/create.sql && pkill sqlservr
"dos2unix" 的原因是在 visual studio 中创建的 SQL 文件具有独特的隐藏 cr/lf(和其他字符),linux 版本sqlcmd 不会成功解释并会导致错误(这有点奇怪,而这正是您希望跨平台数据库能够处理的事情)
此外,在最后的 运行 命令中,您必须暂时启动 sql 服务器服务,否则您也会遇到错误;这是一些变通办法,有点繁琐,我不完全确定微软 sql 服务器 linux 容器是否设计得足够好,可以完成像这样恢复数据库的简单任务,细微差别是构建和 运行 构建容器之间的差异,并且需要两种概念的某种快乐中间地带才能工作。
这里给出的不是完整的恢复解决方案,它只处理项目文件中的表,尽管扩展到标量函数和存储过程应该是微不足道的。