Linux入门教程:Dockerfile参考(3) – 解释器指令escape,解释器指令不会添加新


解释器指令是可选的,并影响Dockerfile随后行的处理方式。解释器指令不会添加新层到镜像,也不会显示在构建步骤中。解释器指令的编写格式是一种特定的注释格式# directive=value。一个指令只能用一次。
一旦注释,空行或构建器指令已经被处理,Docker不再寻找解析器指令。相反,它将格式化为解析器指令的任何内容视为注释,并且不尝试验证它是否可能是解析器指令。因此,所有解析器指令必须位于Dockerfile的最顶端。
解析器指令不区分大小写。不过,约定使用小写。也约定解释器指令后包括一个新空行。解析器指令不支持行连续字符。
由于这些规则,下面的示例都是无效的:
由于使用了行连续字符无效:

# direc \ tive=value

由于出现两次相同的解释器指令:

# directive=value1 # directive=value2   FROM ImageName

由于出现在构建指令后,所以视为注释:

FROM ImageName # directive=value

由于出现在不是解释器指令的注释后面,视为一个注释:

# About my dockerfile FROM ImageName # directive=value

由于不被识别,未知的指令视为一个注释。此外由于出现在不是解释器指令的注释后面,一个已知的指令也视为注释。

# unknowndirective=value # knowndirective=value

解析器指令中允许使用非换行符空格。因此,下面的指令视为同样的:

#directive=value # directive =value #   directive= value # directive = value #     dIrEcTiVe=value

目前支持的解释器指令有:

escape

escape

格式为:

# escape=\ (backslash)

# escape=` (backtick)

escape指令用于设置在Dockerfile中转义使用的字符。如果不指定,默认的转义字符是\。
转义字符用来转义一行中的字符,也可以转义一个新行。这就允许Dockerfile的指令跨越多行。注意,不管escape解析器指令是否包括在Dockerfile中,除了在行尾转义新行 RUN命令中不进行字符转义。
设置转义字符`对于windows上使用Dockerfile非常有用,因为默认的\是目录路径的分隔符。而`与Windows PowerShell使用的转义字符一致。
看下下面的在windows Dockerfile的示例,不是很显然地看出错误。第二行行尾的第二个\解释为转义新行,而不是第一个\的转义目标。结果是这个Dockerfile的第2行和第3行合并为一行处理:

FROM windowsservercore 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 : FROM windowsservercore  ---> dbfee88ee9fd Step 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不是所有的命令都支持这个分隔符。
所以最好的解决方法是使用excape解释器指令来指令`作为分隔符:

# escape=`   FROM windowsservercore COPY testfile.txt c:\ RUN dir c:\

结果:

PS C:\John> docker build -t succeeds --no-cache=true . Sending build context to Docker daemon 3.072 kB Step 1 : FROM windowsservercore  ---> dbfee88ee9fd Step 2 : COPY testfile.txt c:\  ---> 99ceb62e90df Removing intermediate container 62afbe726221 Step 3 : RUN dir c:\  ---> Running in a5ff53ad6323  Volume in drive C has no label.  Volume Serial Number is 1440-27FA    Directory of c:\   03/25/2016  05:28 AM    <DIR>          inetpub 03/25/2016  04:22 AM    <DIR>          PerfLogs 04/22/2016  10:59 PM    <DIR>          Program Files 03/25/2016  04:22 AM    <DIR>          Program Files (x86) 04/18/2016  09:26 AM                 4 testfile.txt 04/22/2016  10:59 PM    <DIR>          Users 04/22/2016  10:59 PM    <DIR>          Windows                1 File(s)              4 bytes                6 Dir(s)  21,252,689,920 bytes free  ---> 2569aa19abef Removing intermediate container a5ff53ad6323 Successfully built 2569aa19abef PS C:\John>

相关内容