Dockerfile語法簡介(精)

2021-10-06 17:53:30 字數 4899 閱讀 4543

dockerfile是由一系列命令和引數構成的指令碼,乙個dockerfile裡面包含了構建整個image的完整命令。docker通過docker build執行dockerfile中的一系列命令自動構建image。

# :代表注釋

syntax:

from  [:| @] [as ]
為映象生成元資料標籤資訊

syntax:

label =\

="***x"

多個標籤寫成一行,避免在映象中額外增加layer

作者資訊,寫在from後

syntax:

maintainer "auth "
當複製乙個目錄時,並不會複製目錄本身,而是會遞迴複製其下子目錄 至目標目錄下 **syntax:** ``` copy data /data/ ```

檔案複製準則

add指令類似於copy指令,add支援使用tar檔案和url路徑

syntax:

add ...add ["",...""]
操作準則

如果是乙個本地檔案系統上的壓縮格式的tar檔案,它將被展開為乙個目錄,其行為類似於"tar -x"命令;然而,通過url獲取到的tar檔案將不會自動展開。

如果有多個,或其間接或直接使用了萬用字元,則必須是乙個以/結尾的目錄路徑;如果不以/結尾,則其被視作乙個普通檔案,內容將被直接寫入到

為了讓映象盡量小,最好不要使用 add 指令從遠端 url 獲取包,而是使用 curl 和 wget。這樣你可以在檔案提取完之後刪掉不再需要的檔案來避免在映象中額外新增一層。

示例:

額外操作:

簡單操作:

run mkdir -p /iyunwen/server/ && \

curl -sl \

| tar -xzc /iyunwen/server/ && \

用於為dockerfile中所有run、cmd、entrypoint、copy和add指令設定工作目錄 **syntax:** ``` workdir ```

在dockerfile檔案中,workdir指令可以出現多次,其路徑也可以為相對路徑,不過,其是相對此前乙個workdir指令指定的路徑

另外,workdir也可呼叫由env指定定義的變數

ex:

workdir /var/log

workdir $statepath

接受命令作為引數並用於建立映象,在之前的commit層上形成新的層。 **syntax:** ``` run \(如同執行shell命令 /bin/sh -c) run ["executable","param1","param2"] ```

run ["/bin/bash","-c","",""]
run 指令的快取在下一次構建期間不會自動失效。用於諸如:yum repolist 之類的指令的快取將在下一次構建期間被重用。可以通過--no-cache 引數來使run指令的快取無效,例如: docker build --no-cache

管理命令

某些run 命令依賴於使用管道字元( | )將管道輸出到另乙個命令功能

docker使用 /bin/sh -c 解釋執行這些命令,直譯器只評估管道中最後乙個操作的退出**以確定成功。在上面的例子中,只要wc -l 命令成功,即使wget 命令失敗,該構建步驟也會成功並生成新的映象。

由於管道中任何階段的錯誤而導致命令失敗,請預先 set -o pipefail && 確保意外錯誤可防止構建無意中成功。例如:

set -o pipefail : 表示在管道連線的命令序列中,只要有任何乙個命令返回非0值,則整個管道返回非0值,即使最後乙個命令返回0.

注意:

並非所有的shell都支援 -o pipefail 選項。在這種情況下(例如 dash shell,這是基於debian的映像上的預設shell),請考慮使用exec形式run來明確選擇乙個支援該pipefail選項的shell。如:

類似於run指令,cmd指令也可用於執行任何命令或應用程式,不過,二者的執行時間點不同

syntax:

cmd //支援命令展開,但是不支援傳遞訊號 

cmd ["","",""] //相當於容器的第乙個命令,可以接受訊號

cmd ["param1","param2"]

前兩種語法格式的意義同run

第三種則用於為entrypoint指令提供預設引數

cmd會在啟動容器的時候執行,build時不執行,而run只是在構建映象的時候執行,後續映象構建完成之後,啟動容器就與run無關了。這個命令就相當於在/etc/rc.d/rc.local中寫命令

類似cmd指令的功能,用於為容器指定預設執行程式,從而使得容器像是一具單獨的可執行程式 與cmd不同的是,由entrypoint啟動的程式不會被docker run命令列指定的引數所覆蓋,而且,這些命令列引數會被當作引數傳遞給entrypoint指定的程式。不過,docker run 命令的--entrypoint 選項的引數可覆蓋entrypoint指令指定的程式

syntax:

entrypoint //這種方式能接受shell命令列展開

entrypoint ["","param1"] //展開不了,但能接收到訊號

docker run命令傳入的命令引數會覆蓋cmd指令的內容並且附加到entrypoint命令最後做為其引數使用。dockerfile檔案中也可以存在多個entrypoint指令,但僅有最後乙個會生效

用來指定埠,使容器內的應用可以通過埠和外界互動。 **syntax:** ``` expose [...] ```

告訴docker服務端容器對外對映的本地埠,需要在docker run 的時候使用-p 或者 -p 選項生效。

expose 80/tcp
env指令可以用於docker容器設定環境變數 **syntax:** ``` env env = ... ```

指定乙個環境變數,會被後續run指令使用,並在容器執行時保留。

env設定的環境變數,可以使用 docker inspect 命令來檢視。同時還可以使用 docker run --env =來修改環境變數

用於指定執行image時的或執行dockerfile中任何run、cmd或entrypoint指令指定的程式時的使用者名稱或uid 預設情況下,container的執行身份為root使用者 **syntax:** ``` user | ``` 需要注意的是,\可以為任意數字,但實踐中其必須為/etc/passwd中某使用者的有效uid,否則,docker run命令將執行失敗

用於在dockerfile中定義乙個觸發器 dockerfile用於build映像檔案,此映像檔案亦可作為base image被另乙個dockerfile用作from指令的引數,並以之構建新的映像檔案 在後的這個dockerfile中的from指令在build過程中被執行時,將會「觸發」建立其base image的dockerfile檔案中的onbuild指令定義的觸發器

syntax:

onbuild
注意:

儘管任何指令都可註冊成為觸發器指令,但onbuild不能自我巢狀,且不會觸發from和maintainer指令

使用包含onbuild指令的dockerfile構建的映象應該使用特殊的標籤,例如ruby:2.0-onbuild

在onbuild指令中使用add或copy指令應該格外小心,因為新構建過程和上下文在缺少指定的原始檔時會失敗。

docker 1.12版本後引入的判斷容器狀態是否正常

syntax:

healthcheck [option] cmd //設定檢查容器健康狀況的命令 

healthcheck none //如果基礎映象有健康檢查指令,使用這行可遮蔽掉其健康檢查指令

在沒healthcheck指令前,docker只能通過容器內主程序是否退出來判斷容器是否狀態異常。很多情況下這沒問題,但是如果程式進入死鎖狀態,或者死迴圈狀態,應用程序並不退出,但是該容器已經無法提供服務了。雖然後端的程式可以通過前端的檢測工具來檢查狀態資訊。但是最前端的服務就需要本身的檢測機制加上監控,就可以做到出現問題解決問題。

當在乙個映象指定了 healthcheck 指令後,用其啟動容器,初始狀態會為 starting,在 healthcheck 指令檢查成功後變為 healthy,如果連續一定次數失敗,則會變為 unhealthy。

healthcheck支援下列選項:

和cmd、entrypoint一樣,healthcheck只可以出現一次,如果寫了多個,只有最後乙個生效。cmd 後面的命令也分為shellexec格式。命令的返回值決定了該次檢查的成功與否:0表示成功;1表示失敗;2保留。

Dockerfile語法總結

指令的一般格式為instruction arguments,指令包括from maintainer run等。格式為from或from 第一條指令必須為from指令。並且,如果在同乙個dockerfile中建立多個映象時,可以使用多個from指令 每個映象一次 格式為maintainer,指定維護者...

Dockerfile編寫語法

docker映象本質上就是乙個個基礎映象的堆疊,為了做出我們想要的映象,我們需要考慮最終映象所需的所有基礎環境,然後一層層堆疊.也就是不斷以基礎映象搭建上層映象.先看例子 version 1.0.0 create time 2015 12 25 11 04 author description 基於...

Docker file 語法筆記

instruction argument,命令不區分大小寫,但約定為全部大寫 必須以from命令開始,命令出現的順序就是被執行的順序 from maintainer run 如 cd target tar zxvf datastudio.tar.gz chmod x datastudio bin r...