摘要:其中指令用于指定在構建新鏡像時將使用的基礎鏡像,通用用途的容器一般可以選擇則或者。這張表格里混合了好幾種情況,可以按照縱向列的方式來閱讀。因此命令之間是通過分號進行分隔的。總結文章標題中使用了出行計劃來形容之于容器制作的作用。
前言
在有了Docker相關的基礎知識后,就可以開始指定出行計劃了(Dockerfile),計劃里將記錄我們的出發點(FROM),需要購買的物品(COPY/ADD),在預定的景點拍照(RUN)。當然本身Dockerfile其實也可以在被發明的那個時候稱為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已經不推薦使用,可以使用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指令則是執行PowerShell的Invoke-WebRequest命令下載ServiceMonitor.exe應用。EXPOSE則是用來通知Docker當容器運行時監聽的端口。
命令格式在重點介紹ENTRYPOINT指令前,先來談談Dockerfile中的命令格式,直白的表達就是什么時候用中括號([])。在Docker的官方文檔說明中,使用中括號的被稱為exec格式,反之則稱為shell格式。兩者的區別可以用以下兩個Dockerfile來對比區分。一句話的解釋就是使用exec格式的話,將按照exec中指定的命令運行。使用shell格式化的話,將使用默認命令行執行。
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指令的作用是將容器配置成可執行程序,或者說設置默認執行的程序,而CMD指令只指定了程序默認執行時使用的參數。在Docker的官方文檔中有一張非常好的表格羅列各種情況。現摘錄如下。
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中指定的命令和參數為準(第一列)。當ENTRYPOINT和CMD同時存在,且ENTRYPOINT以shell格式存在時,以ENTRYPOINT中指定的命令為準(第二列)。當ENTRYPOINT和CMD同時存在,且都以exec格式存在,則合并ENTRYPOINT和CMD中指定的命令和參數。
PowerShell及轉義符號PowerShell 首次出現在2006年,它的出現統一了Windows下命令行的設計方式,讓管理員和開發者可以使用動詞-名詞的方式來使用開發命令行工具。PowerShell本身對標Linux的Python,作為膠水語言來簡化操作系統的管理。當然Python目前比PowerShell還是領先一些,Web應用開發的能力也是PowerShell所不具備的,這和PowerShell做為管理員工具存在的初始定位有關。
那么在Dockerfile中如何使用PowerShell呢?這里以一個Dockerfile為例進行說明。首先,通過escape注釋語句設置本Dockerfile中的轉義符號為倒角符(`)。接下來通過SHELL指令設置容器內默認命令行為PowerShell。然后通過RUN指令運行PowerShell命令。這里需要注意的是,示例中運行的已經不是單行命令,而是腳本塊。因此命令之間是通過分號(;)進行分隔的。而為了避免一行命令過長,則使用倒角符截斷命令參數。
PowerShell如果要展開來討論,做為開發語言也有很多要討論的地方,在Dockerfile中一般只是用來執行現成的命令。同時需要注意的在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的存在使得開發人員可以在代碼庫中管理最終交付物的生成過程,比如如果應用要發布到Windows Server, version 1803中,只需更改FROM中使用的基礎鏡像即可。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27295.html
摘要:最終疊加在一起成為新的鏡像。優化的方法就是使用和換行符將多條語句合并成一條執行。第一點,所有指令在中需要大寫,從而和具體的操作命令區分開來。第二點,對于過長的指令請合理使用換行符,從而增加的可閱讀性。 前言 有一定旅行經驗的朋友都知道,即使在出發前制定了詳細的出行計劃,也會在路途中因為各式各樣的狀況而不得不重新修改計劃。這個狀況在我們編寫Dockerfile時一樣存在。花了30分鐘編寫...
閱讀 2162·2023-04-26 00:43
閱讀 2680·2021-11-22 15:22
閱讀 3809·2021-11-11 16:55
閱讀 967·2021-11-04 16:06
閱讀 1783·2019-08-30 14:12
閱讀 994·2019-08-30 14:02
閱讀 3366·2019-08-29 17:05
閱讀 1415·2019-08-29 12:27