手机版

Dockerfile参考(3) – 解释器指令escape

时间:2020-03-16 来源:互联网 编辑:宝哥软件园 浏览:

解释器指令是可选的,并影响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>

版权声明:Dockerfile参考(3) – 解释器指令escape是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐