如何将.bacpac导入docker Sqlserver?

时间:2016-11-18 20:23:09

标签: sql-server macos docker kitematic

我按照this article的说明在我的Mac上的docker容器中安装了Sqlserver。

我使用Kitematic运行容器,并设法使用Navicat Essentials for SQl Server连接到服务器。 服务器有四个数据库,我可以创建新数据库,但理想情况下,我想将现有数据库导入为.bacpac。

过去,from this answer说明对我有用。我可以在容器内运行类似的东西吗?或者,更一般地说,有没有办法在容器中导入数据库?

3 个答案:

答案 0 :(得分:3)

  

大家好!我们终于可以在基于dotnet核心且跨平台的sqlpackage预览版上使用了!以下是下载链接。它们是常绿的链接,即每天都上传新的版本。这样,第二天就可以使用所有已检入的错误修复程序。 .zip文件中包含预览EULA。   linux   https://go.microsoft.com/fwlink/?linkid=873926   操作系统   https://go.microsoft.com/fwlink/?linkid=873927   视窗   https://go.microsoft.com/fwlink/?linkid=873928   发行说明:

     

/ p:CommandTimeout参数硬编码为120       不支持构建和部署贡献者       一种。需要移动到支持System.ComponentModel.Composition.dll的.NET Core 2.1       b。需要处理区分大小写的路径       不支持SQL CLR UDT类型。       一种。这包括SQL Server类型SqlGeography,SqlGeometry和SqlHierarchyId       不支持使用Json序列化的旧.dacpac和.bacpac文件       由于区分大小写的文件系统存在问题,因此引用的.dacpacs(例如master.dacpac)可能无法解析

     

由于缺少更好的方法,请提供您对此GitHub问题的任何反馈。

感谢您尝试一下,让我们知道它的进展!

https://github.com/Microsoft/mssql-docker/issues/135#issuecomment-389245587

编辑:为此,我为您制作了一个Docker映像

https://hub.docker.com/r/samuelmarks/mssql-server-fts-sqlpackage-linux/

设置容器,创建数据库,复制.bacpac文件并将其导入上述数据库的示例:

docker run -d -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' -p 1433:1433 --name sqlfts0 mssql-server-fts-sqlpackage-linux
docker exec -it sqlfts0 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourStrong!Passw0rd>' -Q 'CREATE DATABASE MyDb0'
docker cp ~/Downloads/foo.bacpac sqlfts0:/opt/downloads/foo.bacpac
docker exec -it sqlfts0 dotnet /opt/sqlpackage/sqlpackage.dll /tsn:localhost /tu:SA /tp:'<YourStrong!Passw0rd>' /A:Import /tdn:MyDb0 /sf:foo.bacpac

答案 1 :(得分:2)

Microsoft似乎已在sqlpackage with documentation上实现了对此的支持!

您将必须将sqlpackage添加到您的容器中。

You can download it here.(可选,直接链接到Linux软件包here,希望不会改变)

以下是在Windows计算机上运行此程序的说明-显然,这是使其正常运行的最低要求。请更改密码,并可能将其放在docker-compose.yml中以供重复使用。

我将上述程序包解压缩到文件夹“ c:\ sqlpackage”(我的Windows docker run不允许相对路径),然后然后使用bacpac将其安装到容器中,例如:

docker run -d -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Asdf1234" -v c:\sqlpackage:/opt/sqlpackage -v c:\yourdb.bacpac:/tmp/yourdb.bacpac -p 1433:1433 --name mssql-server-example microsoft/mssql-server-linux:2017-latest

这是* nix用户可以交替运行的内容

docker run -d -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Asdf1234' -v ./sqlpackage:/opt/sqlpackage -v ./yourdb.bacpac:/tmp/yourdb.bacpac -p 1433:1433 --name mssql-server-example microsoft/mssql-server-linux:2017-latest

最后,附加到您的容器并运行:

/opt/sqlpackage/sqlpackage /a:Import /tsn:. /tdn:targetdbname /tu:sa /tp:Asdf1234 /sf:/tmp/yourdb.bacpac

此后,您应该能够将SSMS连接到上面提供的localhost,用户名和密码,并看到“ targetdbname”!这些主要是我为自己写的笔记,但我相信其他人也可以使用它们。

答案 2 :(得分:0)

这似乎不是LINUX实现所支持的功能。

请参阅此link