escape

# escape=\ (backslash)

或者

# escape=` (backtick)

escape指令设置用于对Dockerfile中的字符进行转义的字符。如果未指定,则默认转义字符为\

转义字符用于转义一行中的字符和转义换行符。这允许Dockerfile指令跨越多行。请注意,无论Dockerfile中是否包含转义解析器指令,都不会在RUN命令中执行转义,除非在行末。

Windows上将转义符设置成其他字符特别有用,其中\是目录路径分隔符 , Windows PowerShell一致。

考虑以下示例,该示例在Windows上将以非显而易见的方式失败。第二行末尾的第二个\将被解释为换行符的转义符,而不是第一行\的转义目标。同样,假设第三行末尾的\实际上是作为指令处理的,则将其视为行的延续。该dockerfile的结果是第二和第三行被视为一条指令:

FROM microsoft/nanoserver
COPY testfile.txt c:\ #这里的\会被当成行连续符
RUN dir c:\

结果:

PS C:\John> docker build -t cmd .
Sending build context to Docker daemon 3.072 kB
Step 1/2 : FROM microsoft/nanoserver
 ---> 22738ff49c6d
Step 2/2 : COPY testfile.txt c:\RUN dir c:
GetFileAttributesEx c:RUN: The system cannot find the file specified.
PS C:\John>

上述解决方案之一是将/用作COPY指令dir的目标路径。但是,此语法容器让人产生困惑,因为Windows上的路径并不自然,而最糟糕的是,由于Windows上的所有命令都不支持/作为路径分隔符,因此容易出错。

通过添加escape解析器指令,以下Dockerfile会通过在Windows上使用平台指定的语义(也就是\)来做为文件路径分隔符使用而成功执行:

Last updated

Was this helpful?