1、FROM指令nginx
第一條命令必須是FROM,表示須要構建的鏡像是由哪一個鏡像爲基礎鏡像,後續的指令運行於此基準鏡像所提供的運行環境docker
FROM命令,支持下面兩種形式shell
FROM <image>FROM <image>:<tag>
2、LABEL和MAINTAINER指令數組
指定構建鏡像的做者的信息,新版本docker已經摒棄MAINTAINER,使用LABEL實現,LABEL保存key=value健值對元數據bash
MAINTAINER "做者信息"LABLE maintainer="做者信息"
3、RUN指令curl
RUN指令會在一個新的容器中執行任何命令,能夠出現屢次RUN指令,而後把執行後的改變提交到當前鏡像,提交後的鏡像會被用於Dockfile中定義的下一步操做,RUN中定義的命令會按順序執行並提交tcp
RUN <command> # shell模式,至關於命令行的/bin/bash -c command
<command>一般是一個shell命令,且以"/bin/sh -c"來運行它。
RUN ["<executable>","<param1>","<param2>"] # exec模式,能夠指定其餘的shell執行指令
直接由內核建立運行進程,可處理系統發送過來的信號,沒法調用shell中的變量。參數是一個JSON格式的數組,其中<executable>爲要運行的命令,後面的<paramN>爲傳遞給命令的選項或參數;然而此種格式指定的命令不會以"/bin/sh -c"來發起,若是要運行的命令依賴於此shell特性的話,能夠將其替換爲相似下面的格式ide
RUN ["/bin/bash", "-c", "<executable>", "<param1>"]
4、CMD指令ui
CMD指令中指定的命令會在鏡像運行時執行,在Dockfile中只能存在一個,若是使用了多個CMD指令,則只有最後一個CMD指令有效。當出現ENTRYPOINT指令時,CMD中定義的內容會做爲ENTRYPOINT指令的默認參數,也就是說可使用CMD指令給ENTRYPOINT傳遞參數。url
注意:
一、RUN和CMD都是執行命令,它們的差別在於RUN中定義的命令會在執行docker build命令構建鏡像時執行,而CMD中定義的命令會在執行docker run命令運行鏡像時執行,
二、使用第一種語法也就是調用exec執行時,命令必須爲絕對路徑
CMD ["<executable>","<param1>","<param2>"] #將會調用exec執行,首選方式CMD <command> <param1> <param2> #將會調用/bin/sh -c執行CMD ["param1","param2"] #當使用ENTRYPOINT指令時,爲該指令傳遞默認參數
5、ENTRYPOINT指令
ENTRYPOINT指令中指定的命令會在鏡像運行事執行,在Dockerfile中只能存在一個,若是使用了多個ENTRYPOINT命令,則只有最後一個指令有效。
ENTRYPOINT指令中指定的命令(exec執行的方式)能夠經過docker run來傳遞參數,例如docker run <image> -l 啓動的容器將會把-l 參數傳遞給ENTRYPOINT指令定義的命令並會覆蓋CMD指令中定義的默認參數(若是有的話),但不會覆蓋該指令定義的參數(若是想要覆蓋,在docker run加上參數–entrypoint)。例: ENTRYPOINT ["ls","-a"],CMD["/etc"],當經過docker run <image>啓動容器時該容器會運行ls -a /etc 命令,當使用docker run <image> -l 啓動事,該容器會運行ls -a -l命令,-l參數會覆蓋CMD指令中定義的/etc參數。
ENTRYPOINT ["<executable>","<param1>","<param2>"] #CMD <command> <param1> <param2>
注意:當出現ENTRYPOINT指令時,當ENTRYPOINT指令使用exec方式執行時CMD指令只可能被當作ENTRYPOINT指令的參數使用,其餘狀況CMD指令則會被忽略
6、EXPOSE指令
用於爲容器打開指定要監聽的端口以實現與外部通訊,EXPOSE指令可一次指定多個端口
EXPOSE <port>[/<protocol>] [<port>[/<protocol>]]
#例 EXPOSE 9012/udp 9016/tcp
注意:EXPOSE只是表示當前鏡像在運行爲容器的時候能夠暴露指定的端口,可是須要在docker run的時候配合 -P選項。不然即便在Dockerfile文件中經過EXPOSE指定了端口,在容器運行時默認仍是不會暴露端口的。EXPOSE必定須要配合-P選項才能發揮做用
7、WORKDIR指令
用於爲Dockerfile中全部的RUN、CMD、ENTRYPOINT、COPY和ADD指令設定工做目錄
在Dockerfile文件中,WORKDIR指令能夠出現屢次,其路徑也能夠爲相對路徑,不過,其是相對此前一個一個WORKDIR指令指定的路徑
另外WORKDIR也可調用ENV指定定義的變量
WORKDIR /path/to/workdir
8、COPY指令
用於從指定路徑拷貝一個文件或目錄到容器的指定路徑中
COPY <src> <dest>
<src> : 是一個文件或目錄的路徑,是相對於Dockerfile文件所在位置的相對路徑,<src>路徑必須與Dockerfile在同級目錄或子目錄中,例如不能經過ADD ../somepath,由於在執行docker build時首先作的就是把Dockerfile所在目錄包含子目錄發送給docker。
<dest>:目標容器的一個絕對路徑,不然以WORKDIR爲其起始路徑。注意:在路徑中有空白字符時,一般使用第二種方式
複製規則:
若是<src>是目錄,則其內部文件或子目錄會被遞歸複製,但<src>目錄自身不會被複制,至關於shell 中的cp -r /root/dir/* /tmp
若是指定了多個<src>或在<src>中使用了通配符,則<dest>必須是一個目錄,且必須以/結尾
若是<dest>不存在,它將會被自動建立,包括其父目錄路徑
9、ADD指令
ADD指令相似於COPY指令,<src>是一個文件或目錄的路徑,也能夠是一個url,路徑是相對於該Dockerfile文件所在位置的相對路徑,<dest>是目標容器的一個絕對路徑,
例如/home/harara/Docker/Dockerfile這個文件中的定義的ADD /data.txt /db/指令,將會嘗試拷貝文件/home/harara/Docker/data.txt到將要生成的容器的/db/data.txt
ADD <src> <dest>
# 示例:
COPY nginx-1.15.2.tag.gz /data/ # 單純複製文件ADD nginx-1.15.2.tag.gz /data/ # 解壓複製文件夾
① 若是執行docker build - < somefile即經過標準輸入來建立時,ADD指令只支持url方式,另外若是url須要認證,則能夠經過RUN wget ...或RUN curl ...來完成,ADD指令不支持認證。
② <src>路徑必須與Dockerfile在同級目錄或者子目錄中
③ 若是<src>爲URL且<dest>不以/結尾,則<src>指定的文件將被下載並直接被建立爲<dest>.若是<dest>以/結尾,則文件名URL指定的文件將被直接下載並保存爲<dest>/<filename>
④ 若是<src>是一個本地系統的壓縮格式的tar文件,他將被展開爲一個目錄,其行爲相似於」tar -x」命令,不過經過URL獲取的tar文件將不會被自動展開;
⑤ 若是<src>有多個,或使用了通配符,則<dest>必須是一個以/結尾的目錄路徑;
10、ENV指令
ENV指令用於設置環境變量,構建鏡像過程和容器運行過程都有效。若是須要在運行時更改這些環境變量能夠在運行docker run時添加-env <key>=<value>參數來修改。
注意:最好不要定義那些可能和系統預約義的環境變量衝突的名字,不然可能會產生意想不到的結果
ENV <key> <value>ENV <key>=<value>
第二種格式可一次設置多個變量,每一個變量爲一個」<key>=<value>」的健值對.若是<value>中包含空格,能夠以反斜線(\)進行轉義,也能夠經過對<value>加引號進行標識.另外,反斜線也可用於續行
在docker run的時候能夠經過-e 選項直接覆蓋Dockerfile文件中已經指定的ENV或者添加爲容器新的ENV變量的
11、VOLUME指令
VOLUME指令用來設置一個掛載點,能夠用來讓其餘容器掛載以實現數據共享或對容器數據的備份、恢復或遷移。
VOLUME ["path"]
12、USER指令
USER指令用於設置用戶或uid來運行生成的鏡像和執行RUN命令
USER userUSER user:gidUSER user:group
十3、ONBUILD指令
ONBUILD指令,鏡像觸發器,當一個鏡像被其餘鏡像做爲基礎鏡像時執行,會在構建過程當中插入指令
ONBUILD <INSTRUCTION>
# 示例:
ONBUILD COPY copyFile/config /data #在構建基礎鏡像的dockerfile添加上面命令,實際構建的時候不會執行COPY命令,當構建另外一個新鏡像而且以該鏡像爲基礎鏡像時,會執行COPY命令。
一、ONBUILD指令用來設置一些觸發的指令,用於當該鏡像被做爲基礎鏡像來建立其餘鏡像時(也就是Dockerfile中的FROM爲當前鏡像時)執行一些操做,ONBUILD中定義的指令會在用於生成其餘鏡像的Dockerfile文件的FROM指令以後執行,上述介紹的任何一個指令均可以用於ONBUILD指令,能夠用來執行一些由於環境而變化的操做,使鏡像更加通用。
二、ONBUILD中定義的指令在當前鏡像的build中不會被執行
三、能夠經過查看docker inspeat <image>命令執行結果的onbuild鍵來查看某個鏡像ONBUILD指令定義的內容
四、ONBUILD中定義的指令會當作 引用該鏡像的Dockerfile文件的FROM指令的一部分來執行,執行順序會按ONBUILD定義的前後順序執行,若是ONBUILD中定義的任何一個指令運行失敗,則會使FROM指令中斷並致使整個build失敗,當全部的ONBUILD中定義的指令成功完成後,會按正常順序繼續執行build。
五、ONBUILD中定義的指令不會繼承到當前引用的鏡像中,也就是當引用ONBUILD的鏡像建立完成後將會清除全部引用的ONBUILD指令
六、ONBUILD指令不容許嵌套,例如ONBUILD ONBUILD ADD . /data是不容許的
七、ONBUILD指令不會執行其定義的FROM,MAINTAINER指令