## FROM
尽量使用官方的image作为base image
![](https://img.kancloud.cn/92/16/9216354aeb428ca9f5abd7173259d390_1040x326.png)
## LABEL
使用label可以添加作者信息,版本信息,描述等.
`LABEL`指令会添加元数据到镜像。`LABEL`是以键值对形式出现的。为了在`LABEL`的值里面可以包含空格,你可以在命令行解析中使用引号和反斜杠。
![](https://img.kancloud.cn/55/50/5550db079962b2e1a664e22d5cea62d8_1142x242.png)
## RUN
在build镜像时,开始执行run中的命令,但是需要注意的是,每使用一次run,都会构建新的一层image.所以尽量使用一次.使用&&来连接命令.
**注意:**
* 将多个RUN指令合并为一个
* 基础镜像的标签不要用latest
* 每个RUN指令后删除多余文件
## WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
Dockerfile中的WORKDIR指令用于指定容器的一个目录, 容器启动时执行的命令会在该目录下执行。
![](https://img.kancloud.cn/65/4f/654fb9a798abd334ae80fffc01acfb6e_1203x362.png)
**注意:**
* 用WORKDIR,不要用RUN cd
* 尽量使用绝对目录
## ADD和COPY
复制指令,从上下文目录(本地目录)中复制文件或者目录到image里指定路径。两者区别不大,但是ADD会自动解压打包的文件
**注意:**
* 如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。如果目标路径不存在,则会自动创建目标路径。
* 如果源路径是个文件,且目标路径是不是以 / 结尾,则docker会把目标路径当作一个文件。如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名.如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。
* 如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。
* 如果源文件是个归档文件(压缩文件,比如 .tar文件),则docker会自动帮解压。但是.tar.gz文件是不会自动解压的。
![](https://img.kancloud.cn/89/7a/897aa48d843bbd724ad90c622a87e2e7_970x601.png)
![](https://img.kancloud.cn/dc/e4/dce4f3517c068367a5b48d9985c3b0f5_1435x514.png)
## ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。尽量使用ENV,可以增加可维护性.
![](https://img.kancloud.cn/47/ac/47ac40a022d778ae3bef7895108dab55_1589x241.png)