zdq0394.github.com

Tech study and research.

Follow me on GitHub

Dockerfile

概览

Docker daemon可以读取Dockerfile中的指令自动的构建镜像。 一个Dockerfile就是一个文本文档,其中包含了可以通过命令行执行以组合一个镜像的命令。 通过docker build,可以创建自动构建:相继执行相关的命令行指令。

用法

命令docker build从一个Dockerfile和一个context构建一个镜像。

一个构建的context就是一个文件集合。制定文件集合有2种方式:

  • PATH:本地文件目录及其子目录
  • URL:git仓库及其submodules

执行docker build命令的是docker daemon,不是CLI。所以build流程的第一步就是将整个context发送到docker daemon。

一般情况下,context从一个空文件夹开始,然后在该文件夹下创建Dockerfile,然后只把需要的文件加入到context中。

可以通过Dockerfile中指令使用上下文中的文件,比如COPY指令。为了提高构建的性能,可以把用不到文件exclude掉,通过在context中增加.dockerignore文件。

Dockerfile一般命名为Dockerfile,并放在上下文的根目录下。也可以通过”-f”指定本地文件系统任意位置的Dockerfile。

docker build -f /path/to/a/Dockerfile .

可以通过”-t”指定镜像的tag,可以指定多个”-t”标识。

Docker daemon逐条执行Dockerfile中的指令,并将每条指令的结果commit,从而构建一个中间镜像,直至最终输出最终镜像。 Dockerdaemon会自动清理context。

Dockerfile中的每条指令都是独立的,产生一个新的image。所以指令RUN cd /tmp没有任何意义,对下一条指令也没有影响。

Docker会尽可能的利用cached的中间镜像以加快构建速度。

Format

Dockerfile中命令的格式如下:

# Comment
INSTRUCTION arguments

指令instruction是不区分大小写的。一般情况下,INSTRUCTION都是大写,arguments小写。

Docker daemon按照顺序执行Dockerfile中的指令。一个Dockerfile必须从FROM指令开始。 FROM指令定义了Base Image。 FROM之前能且仅能有若干个ARG指令。ARG定义只能FROM指令中使用的参数。

#开头的是注释;除非该行是合法的parser directive

Parser directive

Parser directive是可选的,影响随后的指令的处理方式。

Parser directive不会添加一个镜像层,也不会显示为一个build step。

Parser directives形式如注释:

# directive=value

一个directive只能使用一次。

所有的Parser directives必须出现在Dockerfile的最前面。 任何注释空行或者指令之后出现的directive格式的行都不会被认为是directive,都认为是注释

Parser directives不区分大小写。一般作小写,并且在parser directives的最后跟着一个空行。与ARG或者FROM分隔开。

escape

escape是一个parser directive。

# escape=\ (backslash)
# escape=` (backtick)

Environment replacement

.dockerignore文件