在Dockerfile中运行sqlcmd

6

是否可以在dockerfile中运行sqlcmd?

首先创建一个层:

FROM microsoft/mssql-server-windows-developer:2017-latest

接下来,我接受许可协议并设置 sa 密码,方法如下:

ENV ACCEPT_EULA=Y

ENV SA_PASSWORD=VerySecret!

在这样做之后,我试图执行一个简单的示例查询:

RUN sqlcmd -S "localhost" -U "SA" -P "VerySecret!" -Q "select name from master.dbo.sysdatabases"

很遗憾,使用docker build命令会出现错误信息“Sqlcmd: 'name from master.dbo.sysdatabases': Unexpected argument. Enter '-?' for help."

我做错了什么吗?

3个回答

6
MS SQL容器可以在使用它们的dockerfile中运行SQL语句。
我认为你的问题只是因为双引号被从你的RUN命令中剥离了。
我无法确定这是否是基于这个github问题的错误,但用\"进行转义可以解决它。
您还可以通过默认使用trusted connection来避免在docker文件中设置SA密码。
run sqlcmd -Q \"select name from master.dbo.sysdatabases\"

这种方式可以在容器运行时设置变量,例如:
docker run -e ACCEPT_EULA=Y -e SA_PASSWORD=bobleponge -p 1433:1433 <imageid>

非常感谢,我必须转义双引号,而且我不需要SA登录 :) - Sebastian S.

3

从命令行交互地运行Microsoft SQL Server。

docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa

它会提示输入密码。

"sql1" 是实例的名称。如果没有命名,请使用容器 ID 进行更改。

1>

-1

在 Dockerfile 中无法连接到数据库。

将 Dockerfile 视为 javacccmake 命令。它生成一个二进制映像;一旦构建了该映像,您可以在多个不同的主机上运行它。您可以很容易地想象出工作流程,例如删除和重新创建数据库而无需重建映像,或将映像推送和拉取到具有不同数据库的不同主机上,在这些设置步骤尚未运行。

通常的方法是将容器配置为在启动序列的一部分运行数据库迁移,可能使用自定义入口点脚本。标准数据库映像还配备了一种机制,可在首次创建容器时运行 SQL 脚本,您可以使用它来为应用程序创建空数据库。


现在我不确定你所说的“将图像推送和拉取到具有不同数据库的不同主机上”的意思。我将从使用dockerfile创建的图像中创建容器,并且当这些容器被创建时,它们都应该具有相同的数据库设置。在dockerfile内部连接到数据库就像Peter提到的那样可以实现。 - Sebastian S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接