dockerfile是由一系列命令和引數構成的指令碼,這些命令應用於基礎映象並最終建立乙個新的映象。它們簡化了從頭到尾的流程並極大的簡化了部署工作。dockerfile從from命令開始,緊接著跟隨者各種方法,命令和引數。其產出為乙個新的可以用於建立容器的映象。dockerfile僅僅是構建docker images的原始碼。
注意:對於linux來講,建議使用修改配置檔案的方式,來修改應用配置。對於容器來講,建議通過新增環境變數的方式,來修改設定。
注意:製作映象有兩種方式,基於映象和基於dockerfile。
注釋+指令(引數)
注意:指令本身不區分大小寫。但是按照慣例,建議使用大寫。
注意:dockerfile是順序執行的。
注意:第乙個指令(非注釋行),必須是"from",即基於哪個映象製作新映象。
注意:基於dockerfile,不能使用其父目錄中的內容,只能使用本目錄和子目錄的路徑。
注意:.dockeringore檔案,打包的時候,排除的目錄。
注意:使用的命令都是容器中的命令。
注意:dockerfile,第乙個字母"d"大寫。
注意:dockerfile中的環境變數的格式
$
:給變數設預設值。引用的時候,如果該變數為空,則是用預設的。
$
:判斷該變數是否為空,如果不為空,則使用預設值。反之為空。
from指令是最重要的乙個且必須為dockerfile檔案開篇的第乙個非注釋行,用於為映像檔案構建過程指定基準映象,後續的指令執行於此基準映象所提供的執行環境。**實踐中,基準映象可以是任何可用映象檔案,預設情況下,docker build會在docker主機上查詢指定的映象檔案,在其不存在時,則會從docker hub registry上拉取所需的映象檔案。如果找不到指定的映象檔案,docker build會返回乙個錯誤資訊。
from \[:\]
from \@\
注意::指定作為base image的名稱;
注意::base image的標籤,為可選項,省略時預設為latest;
注意::hash碼;
用於讓dockerfile製作者提供本人的詳細資訊;dockerfile並不限制maintainer指令可在出現的位置,但推薦將其放置於from指令之後。可選項。已經被「lable」項替換。
maintainer \
copy \...\
copy ["\",..."\"]
示例:copy index.html /data/web/html/
示例:copy yum.repos.d /etc/yum.repos.d/
注意::要複製的原始檔或目錄,支援使用萬用字元。
注意:路徑中如果有空白字元,通常使用第二種格式。
注意::目標路徑,即正在建立的image的檔案系統路徑;建議為使用絕對路徑,否則,copy指定則以workdir為起始路徑。
注意:必須是build上下文中的路徑,不能是其父目錄的檔案。
注意:如果是目錄,則其內部檔案或子目錄會被遞迴複製,但目錄自身不會被複製。
注意:必須是build上下文中的路徑,不能是其父目錄中的檔案。
注意:如果指定了多個,或在中使用了萬用字元,則必須是乙個目錄,且必須以"/"結尾。
注意:如果事先不存在,他將會被自動建立,這包括其父目錄路徑。
注意:dockerfile,要惜字如金,每一條命令,都會生成乙個新層。所以盡可能的將多個命令合併為單個層。
add \... \
add ["\",..."\"]
workdir \
示例:workdir /var/log
示例:workdir $statepath
注意:在dockerfile檔案中,workdir指令可出現多次,其路徑也可以為相對路徑,不過,其是相對此前乙個workdir指令指定的路徑。另外,workdir也可調由env指定定義的變數。
volume \
volume ["\"]
注意:如果掛載點目錄路徑下此前有檔案存在,docker run命令會在卷掛載完成後,將此前的所有檔案複製到新掛在的卷中。
expose \[/\] [\[/protocol] ... ]
示例:expose 11211/udp 11211/tcp
注意:用於指定傳輸層協議,可為tcp或者udp,預設是tcp協議。
注意:expose指令可一次指定多個埠。
注意:expose指定了埠,啟動容器的時候,並不一定會直接暴露,在啟動容器的時候,需要「-p」引數,才可以。
env \\
env \=\...
注意:第一種格式中,之後的所有內容均會被視作其的組成部分,因此,一次只能設定乙個變數;
注意:第二種格式可用一次設定多個變數,每個變數為乙個"=「的鍵值對,如果中包含空格,可以使用反斜線轉義,也可以通過對加引號進行標識;另外,反斜線也可以用於續行。
注意:定義多個變數時,建議使用第二種格式,方便在同一層中完成所有的功能。
注意:在dockerfile中定義的環境變數,在啟動容器時,無需指定變數,便自動建立。在執行容器時,通過」-e"引數,可以對他重新賦值。
run \
run ["\","\","\"]
示例:run rm -rf /tmp/pkgs
注意:第一種格式中,通常是乙個shell命令,且以「/bin/sh -c」來執行它,這意味著此程序在容器中的pid不為1,不能接受unix訊號,因此,當使用docker stop 命令停止容器時,此程序接收不到sigterm訊號。並執行了exec命令,程序的pid為1;
注意:第二種語法格式中的引數是乙個json格式的陣列,其中為要執行的命令,後面的為傳遞給命令的選項或引數;然而,此格式指定的命令不會以"/bin/sh -c"來發起,即直接由核心建立程序,因此常見的shell操作,如變數替換、萬用字元將不會進行;不過,如果要執行的命令依賴於此shell特性的話,可以將其替換為類似下面的格式:run ["/bin/bash","-c","",""]
注意:run和cmd使用的時機不同,run是在docker build的時候使用的,cmd是在docker run的時候使用的。
注意:萬用字元、管道、輸入、輸出等操作,只有在shell下才可以使用。如果沒有shell程序,便不可以直接使用了。
注意:exec命令,是使用子程序取代父程序的程序號。
cmd \
cmd ["\","\","\"]
cmd ["param1","param2"]
注意:前兩種語法格式的意義同run;
注意:第三種則用於為enterpoint指令提供預設引數;
entrypoint \
entrypoint ["\","\","\"]
注意:docker run命令傳入的命令引數會覆蓋cmd指令的內容並且附加到entrypoint命令最後作為其引數使用。
注意:dockerfile檔案中也可以存在多個entrypoint指令,但僅有最後乙個會被生效。
user \|\
注意:uid可以為任意數字,但必須為/etc/passwd中某個使用者的uid。
引數:–interval=duration(default:30s)
–timout=duration(default:30s)
–start-period=duration(default:0s)
–retries=n(default:3)
狀態:0:成功
1:不健康
2:預留狀態
示例:healthcheck --interval=5m --timeout=3s cmd curl -f http://localhost/ || exit 1
注意:可以使用docker inspect檢視arg引數。
onbuild \
注意:儘管任何指令都可以註冊成為觸發器指令,但onbuild不能自我巢狀,且不會觸發from和maintainer指令。
注意:使用包含onbuild指令的dockerfile構建的映象應該使用特殊的標籤,例如ruby:2.0-onbuild。
注意:在onbuild指令中,使用add或copy指令應該格外的小心,因為構建過程的上下文在缺少指定的原始檔是會失敗。
Dockerfile基本用法
docker 並不建議使用者通過commit方式構建映象。原因如下 用dockerfile構建映象,底層也docker commit 一層一層構建新映象的。1.執行docker build命令,t將新映象命名,末尾的.指名build context為當前目錄,從當前目錄下尋找dockerfile,也...
Dockerfile基本結構
1.dockerfile是乙個文字格式的配置檔案,使用者可以使用dockerfile快速建立自定義的映象。2.dockerfile檔案分為四個部分 a.基礎映象資訊 在dockerfile中使用 完成一行的註解 第一行必須制定基礎映象 from centos b.維護者資訊 維護者資訊 mainta...
Docker系列 十 Dockerfile指令
dockerfile包含了兩種格式 注釋和指令 comment instruction argument 注釋以 號開頭,指令以大寫的指令名開始,後面是指令的引數。first dockerfile from ubuntu 14.04 maintainer zhiqiangho zhiqiangho ...