将数据库部署到Docker Container microsoft/mssql server linux



我有一个数据库运行在Windows上的SQL Server(13.01)上。我喜欢使用SSDT将它部署到Linux上的Docker容器中。

我可以完美地连接到Docker上运行的服务器,手动创建/删除数据库并播放数据。

问题是我无法发布它。我正在Powershell 上执行以下脚本

PS: SqlPackage.exe /Action:Publish /SourceFile:"d.dacpac" /TargetConnectionString:"server=containeraddress;database=thedatabase;user id=sa;password=thepassword;

并得到以下错误。

无法连接到主服务器或目标服务器"数据库"。在主服务器或目标服务器"数据库"中必须有一个具有相同密码的用户。(Microsoft.Data.Tools.Schema.Sql)

我在目标服务器和源服务器上有相同的用户和密码。

有没有人有同样的问题,知道如何解决?

我将在这里发布这篇文章,因为大多数答案都是指拥有一个现有的已编译dacpac文件,这可能并不总是可能的。我还没有在其他地方看到类似的想法,我在这里建议的解决方案。

考虑到你对docker的使用,如果你想在容器内编译你的visual studio项目,考虑到容器基本操作系统和映像的某些组合,可能不可能用msbuild创建dacpac文件。

您可以使用一系列基于unix的命令来恢复数据库,请注意,visualstudio数据库项目通常只是一系列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];nGOnUSE [database_name];n” >> /database/create.sql
RUN for f in /init/*.sql; do dos2unix $f;  cat $f >> /database/create.sql; echo "nGOn" >> /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"的原因是,在visualstudio中创建的SQL文件具有独特的隐藏cr/lf(和其他字符),linux版本的sqlcmd无法成功解释这些字符,并会导致错误(这有点奇怪,这正是你希望跨平台数据库能够处理的事情)

此外,在最终运行命令中,您必须临时启动sql server服务,否则也会出现错误;这有点麻烦,也有点麻烦。我不完全确定microsoft-sql-server-linux容器是否设计得足够好,足以完成恢复这样一个数据库的简单任务。细微之处在于构建和运行容器之间的差异,以及它需要这两个概念的某种愉快的中间地带才能工作。

考虑到这里不是一个完整的恢复解决方案,它只处理项目文件中的表,尽管扩展到标量函数和存储过程应该很简单。

您正在使用哪个版本的SqlPackage.exe?只有SqlPackage.exe的最新候选版本支持SQL Server vNext CTP。SqlPackage候选版本可在此处下载:https://www.microsoft.com/en-us/download/details.aspx?id=54273

最新更新