[TOC]
### 1. FROM
> 基础镜像,当前新镜像基于哪个镜像为基础
```
# 摘自nginx dockerfile
FROM debian:buster-slim
```
### 2. MAINTAINER
> 镜像维护者的姓名和邮箱地址
```
MAINTAINER wangking <xxx@qq.com>
```
### 3. RUN
> 容器构建时需要运行的linux命令
```
RUN groupadd -r redis && useradd -r -g redis redis
```
### 4. EXPOSE
> 当前容器对外服务的端口
```
EXPOSE 8080
```
### 5. ENV
> 用来在构建镜像过程中设置的环境变量
```
ENV MY_PATH /var/www/
WORKDIR $MY_PATH
```
### 6. WORKDIR
> 创建容器后,终端默认登陆进来的`工作目录`,一个落脚点
```
WORKDIR /var/www/
```
### 7. ADD
> 将宿主机下的文件拷贝到镜像,并解压缩(COPY + TAR -zxvf)
```
ADD nginx.tar.gz /usr/local
```
### 8. COPY
> > 将宿主机下的文件拷贝到镜像
```
COPY my.conf /etc/haha/my.conf
```
### 9. VOLUME
> 容器数据卷,用于数据保存和持久化工作
```
VOLUME ["/data1", "/data2"]
```
### 10. CMD
> 指定一个容器启动时要运行的命令
> 注:**dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后参数替换**
```
CMD cat /ect/hosts
CMD ["catalina.sh", "run"]
CMD ["curl", "-s", "http://ip.cn"]
CMD ["/bin/bash"]
```
> docker run 参数替换
```
# 会覆盖dockerfile里的CMD命令
docker run -it centos /bin/bash
docker run -it centos ls -l
```
### 11. ENTRYPOINT
> 指定一个容器启动时要运行的命令,和CMD一样可以有多个,但是不会被覆盖,而是追加。
```
ENTRYPOINT ["curl", "-s", "http://ip.cn"]
```
### 12. ONBUILD
> 当构建一个被继承的dockerfile时运行的命令,父镜像在被子继承后父镜像的onbuild被触发
> 父镜像的dockerfile里加入以下命令,子镜像构建过程中,会触发onbuild命令
```
ONBUILD RUN echo "father onbuild"
```
### 13. dockerfile的构建
> 当前目录下创建文件 `Dockerfile`
> 然后再运行构建命令,则本地就会生成对应的镜像
```
# 14. docker build -t 新镜像名称:TAG .
docker build -t mycentos:1.3 .
# 或 指定dockerfile文件地址
docker build -f /mydocker/Dockerfile -t mycentos:1.3 .
```