上海万网网站建设免费发广告帖子的网站
一、说明
在docker的指令下工作,似乎很简单,然而,对于复杂工程,这些初级知识是不够的。正确使用DockerFile构建镜像是必须的技能。我们这里假定您已经熟练docker的指令,我们继续上升一个台阶,如何用build和dockerfile生成镜像。
二、DockerFile脚本的基本原则
- 该指令不区分大小写。然而,约定是它们是大写的,以便更容易地将它们与参数区分开来。
- Docker 按顺序运行 Dockerfile 中的指令。不存在分支语句。
- Dockerfile 必须以 FROM 指令开头。这可能在解析器指令、注释和全局范围的 ARG 之后。
- 通过一个或多个 ARG 指令,这些指令声明在 FROM 行中使用的参数文件。
- Docker 将以 # 开头的行视为注释,除非该行是有效的解析器指令。
- 行中其他任何位置的 # 标记都被视为参数。
# Comment
RUN echo 'we are running some # of cool things'
三、注释语句语法规则
3.1 编译中注释行视为无有
在执行 Dockerfile 指令之前,有一个语法扫描,在此过程中删除了注释行,这意味着以下示例中的注释不是由执行 echo 命令的 shell 处理的,下面两个示例是等效的:
RUN echo hello \ # comment world | RUN echo hello \ world |
3.2 在注释语句不能续行
注释中不支持行续行字符“\”。比如下列语句中:
# this is an example | 合理语法 |
# this is an \ example | 续行符号无效 |
四、关于空格
4.1 空格出现在语句前
为了向后兼容,注释 (#) 和指令(如 RUN)之前的前导空格被忽略,但不鼓励这种空格行为。解释器不会保留前导空格,因此以下示例是等效的:
# this is a comment-line RUN echo hello RUN echo world | # this is a comment-line RUN echo hello RUN echo world |
4.2 指令中间的空格
但是请注意,指令参数中的空格(例如 RUN 之后的命令)会被保留,因此以下示例打印带有指定前导空格的“hello world”:
RUN echo "\hello\world"
五、解析器指令
5.1 语法规则
解释器指令,就是指定语法按照哪种解释器解释。它的语法规则是:
- 解析器指令是可选的,它会影响处理 Dockerfile 中后续行的方式。
- 解析器指令形式为#directive=value。
- 处理完注释、空行或构建器指令后,Docker 不再查找解析器指令。相反,它会将任何格式化为解析器指令的内容视为注释,并且不会尝试验证它是否可能是解析器指令。
- 解析器指令必须位于 Dockerfile 的最顶部。
- 解析器指令不区分大小写。但是,约定是它们是小写的。
- 解析器指令不支持行继续字符。
5.2 以下示例均无效
1)不支持续行符号
# direc \ tive=value | 解析器指令不支持行继续字符 |
2)出现两次无效
# directive=value1 FROM ImageName | 解析器指令不支持多条同样语句,否则忽略视为无。 |
3)由于出现在构建器指令之后而被视为注释:
FROM ImageName # directive=value | 必须出现在脚本第一条语句位置 |
4)由于出现在不是解析器指令的注释之后而被视为注释:
# About my dockerfile # directive=value FROM ImageName | 理由同上,必须出现在脚本首部。 |
5) 由于未被识别,未知指令被视为注释。
# unknowndirective=value # knowndirective=value | 单词拼写错误,被视为注释。 |
6)解析器指令中允许使用非换行空格。因此下列格式意义相同。
#directive=value # directive =value # directive= value # directive = value # dIrEcTiVe=value | 空格被扫描删除,因而左栏语句相同。 |
5.3 支持以下解析器指令
syntax
escape
1) escape转义符号定义
一般转义符号是“\”,但是不同的操作系统可能有独立规定,因此,这里可以指定转义符号。
示例语法:
# escape=` | 规定转义符号 ` |
# escape=\ | 规定转义符号 \ |
2) 规定解释器版本
#syntax= docker/dockerfile:1 | 用docker/dockerfile:1的解释器 |
#syntax= docker/dockerfile:1.2 | #syntax= docker/dockerfile:1.2解释器 |
建议:除非不得已,不要用这种解析器指令。
六、结论
注释语句也好,解释器语句也好,都不是dockerfile的核心内容,本篇阐述它们的规则,目的有二,其一是期望在dockerfile开发中,不要犯低级错误,避免发生违规而不自知,带来不必要的麻烦。其二,对指令不熟悉,产生盲目猜测,一旦出点错,就瞎找原因。