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

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

  1. # direc \
  2. tive=value

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

  1. # directive=value1
  2. # directive=value2
  3.  
  4. FROM ImageName

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

  1. FROM ImageName
  2. # directive=value

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

  1. # About my dockerfile
  2. FROM ImageName
  3. # directive=value

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

  1. # unknowndirective=value
  2. # knowndirective=value

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

  1. #directive=value
  2. # directive =value
  3. #   directive= value
  4. # directive = value
  5. #     dIrEcTiVe=value

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

  • escape
  • escape

    格式为:

    1. # escape=\ (backslash)

    1. # escape=` (backtick)

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

    1. FROM windowsservercore
    2. COPY testfile.txt c:\\
    3. RUN dir c:\

    构建时输出:

    1. PS C:\John> docker build -t cmd .
    2. Sending build context to Docker daemon 3.072 kB
    3. Step 1 : FROM windowsservercore
    4.  ---> dbfee88ee9fd
    5. Step 2 : COPY testfile.txt c:RUN dir c:
    6. GetFileAttributesEx c:RUN: The system cannot find the file specified.
    7. PS C:\John>

    上面的一个解决方法是使用/作为COPY和dir的路径分隔符。不过这个语法最好的结果是只会由于不是windows原生的分隔符感到混乱,最糟糕的情况是会导致错误,因为windows不是所有的命令都支持这个分隔符。
    所以最好的解决方法是使用excape解释器指令来指令`作为分隔符:

    1. # escape=`
    2.  
    3. FROM windowsservercore
    4. COPY testfile.txt c:\
    5. RUN dir c:\

    结果:

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