我正在尝试构建一个已挂载先前备份的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路径的格式是什么?
答案 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\"