摘要:其中指令用于指定在構建新鏡像時將使用的基礎鏡像,通用用途的容器一般可以選擇則或者。這張表格里混合了好幾種情況,可以按照縱向列的方式來閱讀。因此命令之間是通過分號進行分隔的??偨Y文章標題中使用了出行計劃來形容之于容器制作的作用。
前言
在有了Docker相關的基礎知識后,就可以開始指定出行計劃了(Dockerfile),計劃里將記錄我們的出發(fā)點(FROM),需要購買的物品(COPY/ADD),在預定的景點拍照(RUN)。當然本身Dockerfile其實也可以在被發(fā)明的那個時候稱為Recipe的,只是這個單詞在計算機領域被用到太廣泛了,沒有Dockerfile來得特立獨行。下面就來簡單說說Dockerfile.
Dockerfile簡介Dockerfile是用來構建鏡像的文本文件,其中記錄了如何構建鏡像的命令。按照最新的文檔,目前可以在Dockerfile中使用FROM, RUN, CMD, LABEL, MAINTAINER, EXPOSE, ENV, ADD, COPY, ENTRYPOINT, VOLUME, USER, WORKDIR, ARG, ONBUILD, STOPSIGNAL, HEALTHCHECK, SHELL共18個指令。其中MAINTAINER已經(jīng)不推薦使用,可以使用LABEL替代。
下面就是一個IIS鏡像的例子。這里需要注意的是ENTRYPOINT指令中的使用的ServiceMonitor.exe, 這是專為ENTRYPOINT設計的應用,目前已在Github上開源。
# escape=` FROM microsoft/windowsservercore:1709 RUN powershell -Command ` Add-WindowsFeature Web-Server; ` Invoke-WebRequest -UseBasicParsing -Uri "https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.3/ServiceMonitor.exe" -OutFile "C:ServiceMonitor.exe" EXPOSE 80 ENTRYPOINT ["C:ServiceMonitor.exe", "w3svc"]
其中FROM指令用于指定在構建新鏡像時將使用的基礎鏡像, 通用用途的Windows容器一般可以選擇則 microsoft/windowsservercore 或者 microsoft/nanoserver。如果鏡像是用來運行ASP.NET或者ASP.NET Core應用,那么可以使用 microsoft/aspnet 或者 microsoft/aspnetcore 鏡像。
接下來的RUN指令則是執(zhí)行PowerShell的Invoke-WebRequest命令下載ServiceMonitor.exe應用。EXPOSE則是用來通知Docker當容器運行時監(jiān)聽的端口。
命令格式在重點介紹ENTRYPOINT指令前,先來談談Dockerfile中的命令格式,直白的表達就是什么時候用中括號([])。在Docker的官方文檔說明中,使用中括號的被稱為exec格式,反之則稱為shell格式。兩者的區(qū)別可以用以下兩個Dockerfile來對比區(qū)分。一句話的解釋就是使用exec格式的話,將按照exec中指定的命令運行。使用shell格式化的話,將使用默認命令行執(zhí)行。
exec form
FROM microsoft/windowservercore:1709 RUN ["powershell", "New-Item", "c:/test"]
shell form
FROM microsoft/windowservercore:1709 RUN powershell New-Item c:/testENTRYPOINT 指令
ENTRYPOINT指令的作用是將容器配置成可執(zhí)行程序,或者說設置默認執(zhí)行的程序,而CMD指令只指定了程序默認執(zhí)行時使用的參數(shù)。在Docker的官方文檔中有一張非常好的表格羅列各種情況?,F(xiàn)摘錄如下。
No ENTRYPOINT | ENTRYPOINT exec_entry p1_entry | ENTRYPOINT [“exec_entry”, “p1_entry”] | |
---|---|---|---|
No CMD | error, not allowed | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry |
CMD [“exec_cmd”, “p1_cmd”] | exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry exec_cmd p1_cmd |
CMD [“p1_cmd”, “p2_cmd”] | p1_cmd p2_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry p1_cmd p2_cmd |
CMD exec_cmd p1_cmd | /bin/sh -c exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd |
這張表格里混合了好幾種情況,可以按照縱向列的方式來閱讀。當沒有指定ENTRYPOINT時,以CMD中指定的命令和參數(shù)為準(第一列)。當ENTRYPOINT和CMD同時存在,且ENTRYPOINT以shell格式存在時,以ENTRYPOINT中指定的命令為準(第二列)。當ENTRYPOINT和CMD同時存在,且都以exec格式存在,則合并ENTRYPOINT和CMD中指定的命令和參數(shù)。
PowerShell及轉義符號PowerShell 首次出現(xiàn)在2006年,它的出現(xiàn)統(tǒng)一了Windows下命令行的設計方式,讓管理員和開發(fā)者可以使用動詞-名詞的方式來使用開發(fā)命令行工具。PowerShell本身對標Linux的Python,作為膠水語言來簡化操作系統(tǒng)的管理。當然Python目前比PowerShell還是領先一些,Web應用開發(fā)的能力也是PowerShell所不具備的,這和PowerShell做為管理員工具存在的初始定位有關。
那么在Dockerfile中如何使用PowerShell呢?這里以一個Dockerfile為例進行說明。首先,通過escape注釋語句設置本Dockerfile中的轉義符號為倒角符(`)。接下來通過SHELL指令設置容器內(nèi)默認命令行為PowerShell。然后通過RUN指令運行PowerShell命令。這里需要注意的是,示例中運行的已經(jīng)不是單行命令,而是腳本塊。因此命令之間是通過分號(;)進行分隔的。而為了避免一行命令過長,則使用倒角符截斷命令參數(shù)。
PowerShell如果要展開來討論,做為開發(fā)語言也有很多要討論的地方,在Dockerfile中一般只是用來執(zhí)行現(xiàn)成的命令。同時需要注意的在Windows Server, version 1709中PowerShell已從nanoserver鏡像中移除。
#escape=` FROM microsoft/windowsservercore SHELL [ "powershell", "-command" ] RUN $ErrorActionPreference = "Stop"; ` $ProgressPreference = "SilentlyContinue"; ` $null = New-Item -Path c:apps -Type Directory RUN Invoke-WebRequest -Uri https://download.sysinternals.com/files/SysinternalsSuite.zip ` -UseBasicParsing -OutFile c:appsSysinternalsSuite.zip ` -Proxy http://192.168.0.124:1080; ` Expand-Archive -Path C:appsSysinternalsSuite.zip -DestinationPath C:appssysinternals -Force; ` Remove-Item -Path c:appsSysinternalsSuite.zip ENTRYPOINT [ "powershell" ]總結
文章標題中使用了出行計劃來形容Dockerfile之于容器制作的作用。技術上來說Dockerfile的存在使得開發(fā)人員可以在代碼庫中管理最終交付物的生成過程,比如如果應用要發(fā)布到Windows Server, version 1803中,只需更改FROM中使用的基礎鏡像即可。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/27295.html
摘要:最終疊加在一起成為新的鏡像。優(yōu)化的方法就是使用和換行符將多條語句合并成一條執(zhí)行。第一點,所有指令在中需要大寫,從而和具體的操作命令區(qū)分開來。第二點,對于過長的指令請合理使用換行符,從而增加的可閱讀性。 前言 有一定旅行經(jīng)驗的朋友都知道,即使在出發(fā)前制定了詳細的出行計劃,也會在路途中因為各式各樣的狀況而不得不重新修改計劃。這個狀況在我們編寫Dockerfile時一樣存在。花了30分鐘編寫...
閱讀 2168·2023-04-26 00:43
閱讀 2688·2021-11-22 15:22
閱讀 3822·2021-11-11 16:55
閱讀 972·2021-11-04 16:06
閱讀 1790·2019-08-30 14:12
閱讀 1004·2019-08-30 14:02
閱讀 3374·2019-08-29 17:05
閱讀 1421·2019-08-29 12:27