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:由于历史遗留原因,"."模式被忽略
浙公网安备 33010602011771号