在Dockerfile中运行sqlcmd

在Dockerfile中运行sqlcmd,docker,dockerfile,Docker,Dockerfile,是否可以在dockerfile中运行sqlcmd 首先,我创建一个图层 FROM microsoft/mssql-server-windows-developer:2017-latest 之后,我接受eula并按如下方式设置sa密码: ENV ACCEPT_EULA=Y ENV SA_PASSWORD=VerySecret! docker run -e ACCEPT_EULA=Y -e SA_PASSWORD=bobleponge -p 1433:1433 <imageid>

是否可以在dockerfile中运行sqlcmd

首先,我创建一个图层

FROM microsoft/mssql-server-windows-developer:2017-latest
之后,我接受eula并按如下方式设置sa密码:

ENV ACCEPT_EULA=Y

ENV SA_PASSWORD=VerySecret!
docker run -e ACCEPT_EULA=Y -e SA_PASSWORD=bobleponge -p 1433:1433 <imageid>
完成此操作后,我将尝试执行一个简单的示例查询:

RUN sqlcmd -S "localhost" -U "SA" -P "VerySecret!" -Q "select name from master.dbo.sysdatabases"
不幸的是,docker build命令中断,出现错误消息“Sqlcmd:“name from master.dbo.sysdatabases”:意外参数。请输入“-?”以获取帮助


我做错什么了吗?

不可能连接到Dockerfile中的数据库

将Dockerfile想象成一个
javac
cc
make
命令。它产生一个二值图像;一旦构建了该映像,就可以在多个不同的主机上运行它。您可以很容易地想象这样的工作流:在不重建映像的情况下删除和重新创建数据库,或者将映像推拉到具有不同数据库的不同主机上,而这些设置步骤尚未运行


这里通常的方法是将容器配置为在启动序列中运行数据库迁移,可能使用自定义入口点脚本。股票数据库映像还具有一种机制,可以在首次创建容器时运行SQL脚本,您可以使用该脚本为应用程序创建空数据库。

MS SQL容器可以在使用它们的
dockerfile
中对它们运行SQL语句

我认为您的问题只是从
RUN
命令中删除了双引号

我不能确定这是否是一个基于的bug,但作为
\“
将解决它

您还可以通过默认设置受信任的连接来避免在docker文件中设置SA密码:

这样,可以在容器运行时设置变量,如下所示:

ENV ACCEPT_EULA=Y

ENV SA_PASSWORD=VerySecret!
docker run -e ACCEPT_EULA=Y -e SA_PASSWORD=bobleponge -p 1433:1433 <imageid>
docker run-e ACCEPT_EULA=Y-e SA_PASSWORD=bobleponge-p 1433:1433

非常感谢,我不得不避开双引号,我不需要SA登录:)现在我不知道“将图像推拉到具有不同数据库的不同主机上”是什么意思“。我将从使用dockerfile创建的图像创建容器,所有这些容器在创建时应具有相同的数据库设置。连接到dockerfile中的数据库就像Peter提到的那样。