dockerfile深入学习之初识dockerfile~2

escape:转义

escape代表dockerfile中的转义指令,用户可以通过escape来自己指定转义符号、比如:

# escape=\

# escape=`

默认情况下使用'\'

转义字符既用于转义一行中的字符,也用于转义换行符。 这允许Dockerfile指令跨越多行

Note:RUN指令不执行转义、除非是在一行行尾

如果是在windows下

FROM microsoft/nanoserver

COPY testfile.txt c:\\(第二个’\’会被当成转义)

RUN dir c:\(同上)

(因此,对习惯于在windows环境下操作的同学来说,将转义符设置为`会很方便、因为windows下目录路径形式是"\\")

 

Environment replacement:环境替换

Dockerfile 可以通过环境变量获取所需变量

表示方法:

  $variable_name

  ${variable_name}

使用大括号通常用于解决变量名与字符串或数字之间连接的问题、比如:${foo}_bar,此处如果没有大括号、环境变量将会变成$foo_bar

环境变量还支持一部分bash修饰符、如下:

${variable:-word}:表示如果变量没有设置,则其值为"word"。

${variable:+word} :表示如果变量有被设置,则春值为"word",如果没有被设置,则其值为一个空字符串

此处word可以表示任何string类型数据,也可以是另外的环境变量

另外、如果在环境变量前加上转义符,则会将变量原样转换成对应的单词、如下

\$foo会被转换为$foo(此处不再是环境变量、仅仅代表"$foo"这么一个字符串)

实例:

  FROM busybox

  ENV foo /bar

  WORKDIR ${foo} #工作目录为 /bar

  ADD . $foo    $ ADD . /bar

  COPY \$FOO /QUUX # COPY $foo /quux

环境变量支持如下指令:

  ADD

  COPY

  ENV

  EXPOSE

  FROM

  LABEL

  STOPSIGNAL

  USER

  VOLUME

  WORKDIR

以及:

  ONBUILD(需要与上述指令之一结合使用)

 

.dockerignore file

.dockerignore文件用于提示docker CLI在发送上下文到docker daemon时,应该将哪些文件或目录忽略掉、这样做是为了避免将不必要的大文件或敏感文件、目录发送到docker daemon中、增加资源消耗

docker CLI会以类似于unix的文件格式识别.dockerignore文件,因此、为了达到匹配目的、上下文的根目录会同时作为工作目录和根目录使用,例如,patterns / foo / bar和foo / bar都会在PATH的foo子目录或位于URL的git存储库的根目录中排除名为bar的文件或目录。

实例:

  # comment 注释

  */temp* 忽略root一级子目录下所有以temp开始文件和目录

  */*/temp* 忽略root二级子目录下所有以temp开始文件和目录

  temp?  忽略以temp开始、后接一个字符的文件和目录

  **/*.go 忽略所有目录下,以.go结尾的文件 此处的**匹配做生意层次下的路径

以感叹号"!"开始表示例外、

实例:

  *.md

  !README.md

  上述实例表示忽略上下文中除README.md文件之外的所有以.md结尾的文件

NOTE:”!“的位置会影响.dockerignore执行结果、如下:

  *.md

  !README*.md

  README-secret.md

  上述实例表示忽略上下文中除包含README*.md文件之外所有的.md文件、但README-secret.md也被忽略、因为它在!README*.md之后

  而

  *.md

  README-secret.md

  !README*.md

  则表示忽略上下文中除包含README*.md文件之外所有的.md文件,此处的README-secret.md不再起作用、因为其后紧跟!README*.md

简单来说,”!“匹配规则不能对排在其后面的文件起作用

另外、还可以将.dockerignore文件用于.dockerignore本身以及Dockerfile文件,如果用于这两者,它们仍然会被发送到docker daemon中,但ADD和COPY指令不再再将其拷贝到镜像中去

最后、如果想指定哪些文件在上下文中被包含(而不是忽略)、可以通过先指定*规则进行排除、在其后指定!规则列举例外、列举的例外即是指定的被包含的文件

NOTE:由于历史遗留原因,"."模式被忽略

posted on 2017-12-22 17:55  残天  阅读(174)  评论(0)    收藏  举报

导航