[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 .
```