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上使用平台指定的语义(也就是\)来做为文件路径分隔符使用而成功执行:

PS C:\John> docker build -t succeeds --no-cache=true .
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM microsoft/nanoserver
 ---> 22738ff49c6d
Step 2/3 : COPY testfile.txt c:\
 ---> 96655de338de
Removing intermediate container 4db9acbb1682
Step 3/3 : RUN dir c:\
 ---> Running in a2c157f842f5
 Volume in drive C has no label.
 Volume Serial Number is 7E6D-E0F7

 Directory of c:\

10/05/2016  05:04 PM             1,894 License.txt
10/05/2016  02:22 PM    <DIR>          Program Files
10/05/2016  02:14 PM    <DIR>          Program Files (x86)
10/28/2016  11:18 AM                62 testfile.txt
10/28/2016  11:20 AM    <DIR>          Users
10/28/2016  11:20 AM    <DIR>          Windows
           2 File(s)          1,956 bytes
           4 Dir(s)  21,259,096,064 bytes free
 ---> 01c7f3bef04f
Removing intermediate container a2c157f842f5
Successfully built 01c7f3bef04f
PS C:\John>

Last updated