linux-tutorial/docs/docker/basics/docker-dockerfile.md

86 lines
2.2 KiB
Markdown
Raw Normal View History

2018-03-30 16:41:01 +08:00
# Dockerfile
## 格式
Dockerfile 中,对于指令不区分大小写,但是推荐使用大写,来区别于参数。
Dockerfile 中将按照指令instruction出现次序依次执行。**注意Dockerfile 必须从 `FROM` 指令开始。**
Dockerfile 中,将 `#` 开头的行作为注释除非该行是有效的解析指令parser directives。一行中的 `#` 标记被视为参数。注释中不支持换行符。
示例:
```
# Comment
RUN echo 'we are running some # of cool things'
```
## 解析指令parser directives
解析指令是可选的,并且会影响 Dockerfile 中后续行的处理方式。解析指令不会将图层添加到构建中,并且不会显示为构建步骤。解析指令以 `# directive=value` 的形式写入特殊类型的注释。单个指令只能使用一次。
一旦注释空行或构建指令已被处理Docker 不再查找解析指令。相反它将任何符合解析指令格式的内容视为注释不会尝试验证它是否可能是解析指令。因此所有解析指令都必须位于Dockerfile 的最顶端。
解析指令不区分大小写。但是,约定是小写。约定还包括在任何解析指令之后的空白行。解析指令不支持续行符。
以下列举几个不合规范的示例。
因为续行符而无效:
```
# direc \
tive=value
```
因为出现两次解析指令而无效:
```
# directive=value1
# directive=value2
FROM ImageName
```
解析指令由于出现在构建指令后,而被视为注释:
```
FROM ImageName
# directive=value
```
解析指令由于出现在注释后,而被视为注释:
```
# About my dockerfile
# directive=value
FROM ImageName
```
因为无法识别,未知的指令被视为注释。此外,因为前一个未知指定被视为注释,后一个指令相当于出现在注释后,而也被视为了注释:
```
# unknowndirective=value
# knowndirective=value
```
解析器指令中允许使用非分行空白。因此,以下几行都是一致对待的:
```
#directive=value
# directive =value
# directive= value
# directive = value
# dIrEcTiVe=value
```
### escape
```
# escape=\ (backslash)
```
```
# escape=` (backtick)
```
在 Dockerfile 中,