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