Sql server 使用SQL Server(Linux)和我自己的数据库创建docker映像:容器中找不到数据库

Sql server 使用SQL Server(Linux)和我自己的数据库创建docker映像:容器中找不到数据库,sql-server,docker,Sql Server,Docker,我从Docker开始,我需要创建一个包含SQL Server和我自己的数据库的映像,以便稍后在多容器堆栈中使用 我的主机是一个Windows10Pro工作站,但我将为所有这些层使用Linux容器。首先,我将创建一个从microsoft/mssql server linux:2017最新版本中派生的映像,其中包含我自己的数据库 我正在遵循中列出的步骤,即: 1.打开提升的Powershell提示符并执行: docker pull microsoft/mssql-server-linux:2017-

我从Docker开始,我需要创建一个包含SQL Server和我自己的数据库的映像,以便稍后在多容器堆栈中使用

我的主机是一个Windows10Pro工作站,但我将为所有这些层使用Linux容器。首先,我将创建一个从microsoft/mssql server linux:2017最新版本中派生的映像,其中包含我自己的数据库

我正在遵循中列出的步骤,即:

1.打开提升的Powershell提示符并执行:

docker pull microsoft/mssql-server-linux:2017-latest

docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=mypwdhere" --name "sql1" -p 1401:1433 -v sql1data:/var/opt/mssql -d microsoft/mssql-server-linux:2017-latest
我现在可以确保容器已安装了
docker ps-a

2.将备份文件复制到容器中:

docker cp mydatabase.bak sql1:/home
docker commit sql1 mydatabase-sql
3.我可以使用此命令获取要还原的文件的逻辑名称:

docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "RESTORE FILELISTONLY FROM DISK='/home/mydatabase.bak'"
4.获得这些名称后,我将运行restore命令:

docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "RESTORE DATABASE [mydatabase] FROM DISK='/home/mydatabase.bak' WITH MOVE 'mydatabase' TO '/var/opt/mssql/data/mydatabase.mdf', MOVE 'mydatabase_log' TO '/var/opt/mssql/data/mydatabase.ldf'"
restore命令成功

5.最后,我删除bak文件:

docker exec -it sql1 rm /home/mydatabase.bak
要检查是否一切正常,我可以使用以下命令列出容器中的数据库:

docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "SELECT Name FROM sys.Databases"
docker exec -it mydb-sql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "SELECT Name FROM sys.Databases"
当我执行此操作时,我可以看到我的数据库被列出

6.我从容器中创建图像:

docker cp mydatabase.bak sql1:/home
docker commit sql1 mydatabase-sql
我可以在如下容器中运行此图像:

docker run --name mydb-sql -p 1401:1433 mydatabase-sql
现在,服务器在127.0.0.1(本地主机)端口1401侦听。我可以使用以下SSMS成功登录:
localhost,1401
;用户=
sa
;密码=
mypwdhere

问题是,一旦连接,我就看不到我的数据库。我只能看到系统数据库,如
master
,其他什么都看不到。如果我尝试直接从容器执行查询,如下所示:

docker exec -it mydb-sql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "USE [mydatabase]; SELECT COUNT(*) FROM Document"
我得到一个错误,告诉我这个数据库不存在。事实上,如果我尝试使用以下命令列出数据库:

docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "SELECT Name FROM sys.Databases"
docker exec -it mydb-sql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "mypwdhere" -Q "SELECT Name FROM sys.Databases"

我只得到
master
tempdb
model
msdb
。我这里缺少什么?

在步骤
1
中,您正在容器中装入一个卷,其中包含:

-v sql1data:/var/opt/mssql

因此,任何db操作都不是容器文件系统的一部分,因此在以后运行
docker commit
时不包括在内

将运行时数据(如数据库)放在单独的Docker中是最佳实践,但是安装mount应该会得到预期的结果,尽管我建议在提交最终映像之前停止容器


此外,除非你只是在玩,否则请看看如何正确地构建Docker形象<由于缺少生成可重复性,不建议使用代码>提交。

另一个选项是Microsoft Windows Server core 1709包括网络SMB文件共享支持,支持远程装载到数据库。您需要为每个容器构建运行Dockerfile(给定的装载点不会像上面提到的那样在映像中持久化)

谢谢Erik,我没有注意到卷标志,引用的页面似乎没有强调这一点。。这就解决了这个问题(现在只是玩游戏,但我将在这个实验之后通过收集我的操作来构建Dockerfile)。