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

时间:2017-01-26 09:32:43

标签: sql-server linux docker sql-server-data-tools dacpac

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

我可以完美地连接到在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)

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我将在此处发布该内容,因为大多数答案都涉及拥有一个已编译的dacpac文件,这可能并非总是可能的。我没有看到类似的想法在其他地方发布给我在这里建议的解决方案。

鉴于您使用的是docker,并且如果您希望在容器内编译Visual Studio项目,则鉴于容器基础操作系统和映像的某些组合,可能无法使用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无法成功解释该隐藏的cr / lf并会导致错误(这有点奇怪)而这正是您希望跨平台数据库能够应付的事情

此外,在最终运行命令中,您必须临时启动sql server服务,否则您将收到错误;这是一个变通办法,有点儿怪异,我不确定sql sql server linux容器是否设计得足够好,足以完成像这样还原数据库的简单任务,细微之处在于构建和升级之间的区别。运行一个容器,并且需要这两个概念之间有某种令人满意的中间点才能使其工作。

鉴于这里不是还原的完整解决方案,它只处理项目文件中的表,尽管扩展到标量函数和存储过程应该不那么容易。