Dockerfile文件語法

 

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指令

相關文章
相關標籤/搜索