一、什么是Dockerfile

Dockerfile是为了快速的构建docker image而设计的,当你使用docker命令的时候,docker会读取当前目录下的命名为Dockerfile(首字母大写)的纯文本文件并执行里面的指令构建出一个docker image。

Dockerfile由一行行的命令语句组成,并且支持以#开头的注释行。指令是不区分大小写的,但是通常我们都大写。

一般的,我们将Dockerfile分为四部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

二、Dockerfile常用指令介绍

1、FROM

格式:FROM或者FROM: FROM必须是Dockerfile里的第一条指令(除注释外),后面跟有效的镜像名,如果在本地仓库没有该镜像,就会去远程仓库拉取。然后的指令在FROM的镜像中执行。

2、MAINTAINER

格式:MAINTAINER 指定维护者的信息。

3、RUN

格式:RUNRUN["", "", ""] 运行命令,命令较长时可以使用""换行。

4、CMD

格式:CMD ["","",""] CMD指定容器启动时执行的命令,每个Dockerfile只能有一条CMD命令,如果指定了多条,只能最后一条会被执行。如果你在启动容器的时候也指定了命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。

5、ENTRYPOINT

格式:ENTRYPOINT ["","",""] 和CMD类似都是配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。每个Dockerfile文件中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。ENTRYPOINT没有CMD的可替换特性,也就是你启动容器的时候增加运行的命令不会覆盖ENTRYPOINT指定的命令。

6、USER

格式:USER daemon 指定运行容器的用户名和UID,后续的RUN指令也会使用这里指定的用户。

7、EXPOSE

格式:EXPOSE [...] 设置Docker容器内部暴露的端口号,在启动容器时增加-p或-P参数做端口映射。

8、ENV

格式:ENV 设置环境变量,会被RUN命令使用,容器启动时这些环境变量都会被指定。

9、ADD

格式:ADD 复制指定的文件到容器的文件系统中。所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0
如果文件是可识别的压缩格式,那么docker会自动解压。可以访问网络资源,类似wget

10、COPY

格式:COPY 复制命令,功能类似ADD,但是不会自动解压文件,也不能访问网络资源。

11、VOLUME

格式:VOLUME ["/mnt"] 将本地文件夹或者其他容器的文件夹挂载到容器当中,一般用来保存重要的数据。

12、WORKDIR

格式:WORKDIR /path/to/workdir 切换目录,为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。可以多次切换(相当于cd命令),也可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

13、ONBUILD

格式:ONBUILD [INSTRUCTION] 配置当前创建的镜像作为其它新创建的镜像的基础镜像时,所执行的操作指令。

参考文章:
http://k8s.unixhot.com/docker/docker-image.html#dockerfile1