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
目前支持的解释器指令有:
escapeescape
格式为:
# 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>
版权声明:Dockerfile参考(3) – 解释器指令escape是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。