---
**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"] #引用腳本
```