在docker sql字符串中转义windows文件路径

时间:2018-03-14 08:41:20

标签: tsql docker sqlcmd

我正在尝试构建一个已挂载先前备份的sql server docker镜像。我的docker文件看起来像这样(我知道恢复命令不正确):

FROM microsoft/mssql-server-windows-developer

RUN mkdir "C:\\SQLServer"

COPY Backup.bak C:\\SQLServer

ENV sa_password=verysecurepassword

ENV ACCEPT_EULA=Y

RUN sqlcmd -S 127.0.0.1 -Q "RESTORE DATABASE [MyDatabase] FROM DISK = N'C:\\SQLServer\\Backup.bak' WITH FILE = 1, NOUNLOAD, REPLACE, NORECOVERY, STATS = 5" 

当我使用此文件运行docker build时,我收到以下错误:

Sqlcmd: 'DATABASE [MyDatabase] FROM DISK = NC:\\SQLServer\\Backup.bak WITH FILE = 1 NOUNLOAD REPLACE NOR = 5': Unexpected argument. Enter '-?' for help.

正如您所看到的,它已经删除了文件路径周围的单引号。我尝试转义单引号(带反斜杠),但引号仍然被剥离,在路径中留下额外的反斜杠。

如果我直接在容器上运行sqlcmd,我可以运行restore命令(并获得有关未被复制的文件的错误,这是预期的)。在dockerfile sql字符串中嵌入windows路径的格式是什么?

1 个答案:

答案 0 :(得分:0)

对于Docker,您应该使用\来绕过SQL的双引号

对于Powershell,您应该使用`来转义文件名周围的单引号

RUN sqlcmd -S 127.0.0.1 -Q \"RESTORE DATABASE [MyDatabase] FROM DISK = N`'C:\\SQLServer\\Backup.bak`' WITH FILE = 1, NOUNLOAD, REPLACE, NORECOVERY, STATS = 5\"