---
**FROM 指定基础镜像**
```
FROM <镜像>:[tag]
FROM <镜像>@digest[校验码]
```
**MAINTAINER 提供Dockerfile 制作者提供本人信息**
```
MAINTANIER "maXcon <409985270@qq.com>"
```
**COPY 把宿主机中的文件复制到镜像中去**
- src 原文件
- 支持通配符
- 通常相对路径
- dest 目标路径
- 通常绝对路径
有空白字符隔开的字串需要用"",否则会被当做两个文件
> 文件复制准则:
> 1 src必须是build上下文中的路径,不能是其父目录
> 2 如果src是目录,则其内部文件或子目录会被递归复制但src目录自身不会被复制
> 3 如果指定了多个src,或在src中使用了通配符,则dest必须是一个目录,且必须以/结尾
> 4 如果dest实现不存在,它将会被自动创建,这包括其父目录
**ADD 类似COPY命令**
支持URL路径----如果可以访问网络的话,会访问网络下载到本地然后打包进镜像
> 操作准则:
1 如果src为URL且dest不以/结尾,则src指定的文件将被下载并
直接被创建为dest;如果dest以/结尾,则文件名URL指定的文件
将被直接下载并保存为dest/filename
2 如果是压缩包会被解压,但通过URL路径获取到的tar文件不会被展开
3 如果src有多个,或其间接或直接使用了通配符,则dest必须是一个
以/结尾的目录路径,如果dest不以/结尾,则其被视为一个普通文件
src的内容将被直接写入到dest中
**WORKDIR 指定工作目录**
> 每次只会影响这个指令后续的指令
```
ADD nginx-1.14.2.tar.gz /usr/local/src/ #不受影响
WORKDIR /usr/local/src/
ADD nginx-1.14.2.tar.gz ./ #受影响
```
**VOLUME 卷**
只能定义docker管理的卷:
```
VOLUME /data/mysql
```
运行的时候会随机在宿主机的目录下生成一个卷目录
**EXPOSE 为容器打开指定要监听的端口以实现与外部通信**
使用格式:
```
EXPOSE 80/tcp 23/udp
```
不加协议默认为tcp
使用-P选项可以暴露这里指定的端口, 但是宿主的关联至这个端口的端口是随机的
**ENV**
用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于
其后的其它命令所调用
调用格式:
`$A` 或 `${A}`
```
ENV <key> <value>
ENV <key>=<value>
```
第一种格式中,`key`之后的所有内容均会被其视作`<value>`的组成部分
因此,一次只能设置一个变量
第二种格式可用一次设置多个变量,每个变量为一个`<key>=<value>`
的键值对,如果`<value>`中包含空格,可以反斜线(\)进行转义
也可以通过对`<value>`加引号进行标识。另外,反斜线也可用于续航
定义多个变量时。建议使用第二种方式,以便在同一层中完成所有功能
具体用法:
```
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin/
ENV A /web/html
COPY index.html ${A:-/web/html}
```
在docker run 中传递变量:
`docker run -e [list] `传变量值
如果在dockerfile中赋值变量后也能在docker run中继续赋值
`docker run --name b1 --rm -e A=xx [镜像ID]`
不会影响docker build 的过程
`printenv`输出环境变量信息
**RUN命令**
使用格式: `RUN <command>`
```
RUN ["<executable>","<param1>","<param2>"]
```
第一种格式中`<command>`命令通常是一个shell命令,且以`/bin/sh -c`来运行它
这意味此进程在容器中的PID不能为1,不能接收Unix信号,因此,当使用docker stop命令
来停止容器时,此进程接收不到信号
第二种语法格式中的参数是一个JSON格式的数组,其中`<executable>`为要运行的命令,后面的
`<paramN>`为传递给命令的选项或参数,然而,此种格式指定的命令不会以`/bin/sh -c`来运行它
因此常见的shell操作如变量替换以及通配符替换将不会进行 不过如果要运行的命令依赖于
此shell特性的话,可以将其替换为下面的格式:
```
RUN ["/bin/bash","-c","<executable>","<param1>"]
```
**CMD 运行于docker run中**
语法有三种写法, 只能是双引号
1. `CMD ["executable","param1","param2"]`启动为ID为1的进程,具体实例:
```
CMD ["/bin/sh","-c","/bin/httpd","-f","-h /web/html"]
```
2. `CMD ["param1","param2"]`
```
CMD ["param1","param2"] # 此种用法用于为ENTRYPOINT指令提供默认参数
CMD ["nginx"]
```
3. `CMD command param1 param2` 直接运行为shell的子进程,param*=执行参数
```
docker run -it -p 8888:80 172.20.23.31/server1/nginx-base:v1 nginx
```
可用于执行脚本\添加脚本:
```
ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
RUN chmod +x /apps/tomcat/bin/run_tomcat.sh
RUN chown -R tomcat:tomcat /apps /data/tomcat
CMD ["/apps/tomcat/bin/run_tomcat.sh"] #引用脚本
```