Dockerfile相似于Makefile,包含有多条构建指令,Docker能够经过Dockerfile自动生成自定义镜像。docker
docker build
命令根据Dockerfile上下文构建镜像。构建的上下文是指定位置PATH或URL的文件集合。PATH是本地文件系统的一个文件夹。URL是一个Git仓库地址。shell
构建由Docker守护进程运行,而不是由CLI运行。构建过程所作的第一件事是将整个上下文递归地发送到守护进程。在大多数状况下,最好以空目录做为上下文,并将Dockerfile保存在该目录中,仅添加构建镜像所需的文件。网络
不要使用根目录,/
做为构建的上下文PATH,这样会致使将磁盘上全部的内容发送到守护进程。curl
在Dockerfile中经过指令指定上下文中的文件。若是要提升构建性能,能够经过.dockerignore排除上下文中的某些文件或目录。ide
# Comment INSTRUCTION arguments
指令不区分大小写,可是惯例使用大写,以便将它们和参数区分开来。工具
Docker按顺序执行Dockerfile中的指令。一个Dockerfile必须用FROM指令启动。性能
Docker使用#做为注释的开头。ui
指定基础镜像,一般咱们会基于某个基础镜像定制本身的镜像,在DockerStore上有不少的官方镜像,咱们能够基于这些镜像来定制本身的镜像。若是没有找到对应的镜像,官方镜像中还提供了一些更为基础的操做系统镜像;除此以外,还存在一个名为scratch的特殊镜像,这个镜像并不实际存在,是一个空白的镜像。url
FROM <image> [AS <name>]
or操作系统
FROM <image>[:<tag>] [AS <name>]
or
FROM <image>[@<digest>] [AS <name>]
执行命令行命令。
RUN有两种形式:
RUN <command>
(shell格式,该命令在shell中运行,默认状况下/bin/sh -c在Linux或cmd /S /C Windows上运行)RUN ["executable", "param1", "param2"]
(exec格式)指定容器主进程的启动命令。在运行时能够指定新的命令来代替这个默认命令。
CMD指令有三种格式:
CMD ["executable","param1","param2"]
(exec格式,通常推荐使用的格式)CMD ["param1","param2"]
(参数列表格式)CMD command param1 param2
(shell格式)LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL指令添加元数据到镜像中。若是要使用包含有空格的元数据,能够给key-value加上引号。
MAINTAINER <name>
这个指令设置镜像的维护者。而LABEL更加灵活,能够设置任何须要的元数据,而且能够轻松查看。要设置MAINTAINER信息可使用LABEL进行设置:
LABEL maintainer="SvenDowideit@home.org.au"
EXPOSE <port> [<port>/<protocol>...]
EXPOSE指令告诉Docker容器在运行时监听指定的网络端口。若是未指定协议,则默认为TCP。
EXPOSE指令仅仅是声明运行时容器打算使用什么端口,并不会自动在宿主进行端口映射。
ENV <key> <value> ENV <key>=<value> ...
ENV指令将环境变量<key>
设置为值<value>
。这个值将在构建阶段中的全部后续指令环境中。
复制文件。
COPY有两种格式:
COPY <src>... <dest>
COPY ["<src>", ... "<dest>"]
更高级的复制文件
ADD指令和COPY基本一致,可是在COPY的基础上加强了一些功能。好比源文件能够是一个URL,在这种状况下,Docker会试图去下载这个连接的文件放到目标路径中,下载后的文件权限自动设置为600,若是这个权限不是想要的权限,那么还须要增长额外的RUN进行权限调整,何况,若是下载的是压缩包,还须要解压缩。因此不如直接调用RUN指令,而后使用wget或者curl工具下载,这个功能并不推荐使用。
若是源文件是一个tar压缩包的话,压缩格式为gzip,bzip2以及xz的状况下,ADD指令将会自动解压缩这个压缩文件到目标路径中,在某些状况下这个自动解压缩的功能很是有用。
入口点
ENTRYPOINT的格式和RUN指令格式同样,分为exec格式和shell格式。
ENTRYPOINT的目的和CMD同样,都是指定了容器启动的参数。ENTRYPOINT在运行时也能够被替代,须要经过docker run
的参数-entrypoint
来指定。
若是指定了ENTRYPOINT指令,CMD就再也不是直接运行了,而是将CMD的内容做为参数传递给ENTRYPOINT指令。
构建参数
ARG <name>[=<defaul value>]
构建参数和ENV的效果同样,都是设置环境变量。不一样的是,ARG所设置的构建环境的环境变量在未来容器运行时是不会存在的。
定义匿名卷
VOLUME ["/data"]
指定工做目录。
使用WORKDIR指令能够指定工做目录。
指定当前用户。