轉自:http://www.javashuo.com/article/p-rkleewlt-hb.html
http://www.javashuo.com/article/p-hpldenwl-hr.htmlhtml
Docker經過對於在Dockerfile中的一系列指令的順序解析實現自動的image的構建
經過使用build命令,根據Dockerfiel的描述來構建鏡像
經過源代碼路徑的方式
經過標準輸入流的方式docker
經過源代碼路徑
Dockerfile須要放置在項目的根目錄位置
在構建的時候,Dockerfile client會把整個context打包發送到Docker Server端,而後由server端負責build鏡像,在構建成功後,會刪除context目錄
docker build -t {鏡像名字} {項目路徑能夠是相對路徑}
docker利用Dockerfile來構建新鏡像以前,先來了解一下Dockerfile建立中使用到的指令json
經過標準輸入流:bash
經過標準輸入流的方式獲取Dockerfile的內容
client不會打包上傳context目錄,所以對於一些ADD、COPY等涉及host本地文件複製的操做不可以支持
docker build -t {鏡像名字} - < Dockerfile路徑網絡
build cache:
Dockerfile中的每個指令執行完畢後,都會提交爲一個image,這樣保證了指令之間不會有影響
Dockerfile會盡量嘗試重用以前已經構建的鏡像
能夠經過在build命令中增長--no-cache的方式來禁用這個cacheui
Dockerfile指令:
只支持Docker本身定義的一套指令,不支持自定義
大小寫不敏感,可是建議所有使用大寫
根據Dockerfile的內容順序執行server
FROM:
FROM {base鏡像}
必須放在DOckerfile的第一行,表示從哪一個baseimage開始構建htm
MAINTAINER:
可選的,用來標識image做者的地方blog
RUN:
每個RUN指令都會是在一個新的container裏面運行,並提交爲一個image做爲下一個RUN的base
一個Dockerfile中能夠包含多個RUN,按定義順序執行
RUN支持兩種運行方式:
RUN
RUN [「executable」,「arg1」,。。],Docker把他看成json的順序來解析,所以必須使用雙引號,並且executable須要是完整路徑
RUN 都是啓動一個容器、執行命令、而後提交存儲層文件變動。第一層 RUN command1 的執行僅僅是當前進程,一個內存上的變化而已,其結果不會形成任何文件。而到第二層的時候,啓動的是一個全新的容器,跟第一層的容器更徹底不要緊,天然不可能繼承前一層構建過程當中的內存變化。而若是須要將兩條命令或者多條命令聯合起來執行須要加上&&。如:cd /usr/local/src && wget xxxxxxx
CMD:
CMD的做用是做爲執行container時候的默認行爲(容器默認的啓動命令)
當運行container的時候聲明瞭command,則再也不用image中的CMD默認所定義的命令
一個Dockerfile中只能有一個有效的CMD,當定義多個CMD的時候,只有最後一個纔會起做用
CMD定義的三種方式:
CMD
CMD ["executable","arg1",....]
CMD ["arg1","arg2"],這個時候CMD做爲ENTRYPOINT的參數
EXPOSE 聲明端口
格式爲 EXPOSE <端口1> [ <端口2> ...]。
EXPOSE 指令是聲明運行時容器提供服務端口,這只是一個聲明,在運行時並不會由於這個聲明應用就會開啓這個端口的服務。在 Dockerfile 中寫入這樣的聲明有兩個好處,一個是幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射;另外一個用處則是在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口。
entrypoint:
entrypoint的做用是,把整個container變成了一個可執行的文件,這樣不可以經過替換CMD的方法來改變建立container的方式。可是能夠經過參數傳遞的方法影響到container內部
每一個Dockerfile只可以包含一個entrypoint,多個entrypoint只有最後一個有效
當定義了entrypoint之後,CMD只可以做爲參數進行傳遞
entrypoint定義方式:
entrypoint ["executable","arg1","arg2"],這種定義方式下,CMD能夠經過json的方式來定義entrypoint的參數,能夠經過在運行container的時候經過指定command的方式傳遞參數
entrypoint
ADD & COPY:
當在源代碼構建的方式下,能夠經過ADD和COPY的方式,把host上的文件或者目錄複製到image中
ADD和COPY的源必須在context路徑下
當src爲網絡URL的狀況下,ADD指令能夠把它下載到dest的指定位置,這個在任何build的方式下均可以work
ADD相對COPY還有一個多的功能,可以進行自動解壓壓縮包
ENV:
ENV key value
用來設置環境變量,後續的RUN可使用它所建立的環境變量
當建立基於該鏡像的container的時候,會自動擁有設置的環境變量
WORKDIR:
用來指定當前工做目錄(或者稱爲當前目錄)
當使用相對目錄的狀況下,採用上一個WORKDIR指定的目錄做爲基準
USER:
指定UID或者username,來決定運行RUN指令的用戶
ONBUILD:
ONBUILD做爲一個trigger的標記,能夠用來trigger任何Dockerfile中的指令
能夠定義多個ONBUILD指令
當下一個鏡像B使用鏡像A做爲base的時候,在FROM A指令前,會先按照順序執行在構建A時候定義的ONBUILD指令
ONBUILD
VOLUME: 用來建立一個在image以外的mount point,用來在多個container之間實現數據共享 運行使用json array的方式定義多個volume VOLUME ["/var/data1","/var/data2"] 或者plain text的狀況下定義多個VOLUME指令