摘要:其中指令用于指定在構(gòu)建新鏡像時(shí)將使用的基礎(chǔ)鏡像,通用用途的容器一般可以選擇則或者。這張表格里混合了好幾種情況,可以按照縱向列的方式來閱讀。因此命令之間是通過分號(hào)進(jìn)行分隔的。總結(jié)文章標(biāo)題中使用了出行計(jì)劃來形容之于容器制作的作用。
前言
在有了Docker相關(guān)的基礎(chǔ)知識(shí)后,就可以開始指定出行計(jì)劃了(Dockerfile),計(jì)劃里將記錄我們的出發(fā)點(diǎn)(FROM),需要購買的物品(COPY/ADD),在預(yù)定的景點(diǎn)拍照(RUN)。當(dāng)然本身Dockerfile其實(shí)也可以在被發(fā)明的那個(gè)時(shí)候稱為Recipe的,只是這個(gè)單詞在計(jì)算機(jī)領(lǐng)域被用到太廣泛了,沒有Dockerfile來得特立獨(dú)行。下面就來簡單說說Dockerfile.
Dockerfile簡介Dockerfile是用來構(gòu)建鏡像的文本文件,其中記錄了如何構(gòu)建鏡像的命令。按照最新的文檔,目前可以在Dockerfile中使用FROM, RUN, CMD, LABEL, MAINTAINER, EXPOSE, ENV, ADD, COPY, ENTRYPOINT, VOLUME, USER, WORKDIR, ARG, ONBUILD, STOPSIGNAL, HEALTHCHECK, SHELL共18個(gè)指令。其中MAINTAINER已經(jīng)不推薦使用,可以使用LABEL替代。
下面就是一個(gè)IIS鏡像的例子。這里需要注意的是ENTRYPOINT指令中的使用的ServiceMonitor.exe, 這是專為ENTRYPOINT設(shè)計(jì)的應(yīng)用,目前已在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指令用于指定在構(gòu)建新鏡像時(shí)將使用的基礎(chǔ)鏡像, 通用用途的Windows容器一般可以選擇則 microsoft/windowsservercore 或者 microsoft/nanoserver。如果鏡像是用來運(yùn)行ASP.NET或者ASP.NET Core應(yīng)用,那么可以使用 microsoft/aspnet 或者 microsoft/aspnetcore 鏡像。
接下來的RUN指令則是執(zhí)行PowerShell的Invoke-WebRequest命令下載ServiceMonitor.exe應(yīng)用。EXPOSE則是用來通知Docker當(dāng)容器運(yùn)行時(shí)監(jiān)聽的端口。
命令格式在重點(diǎn)介紹ENTRYPOINT指令前,先來談?wù)凞ockerfile中的命令格式,直白的表達(dá)就是什么時(shí)候用中括號(hào)([])。在Docker的官方文檔說明中,使用中括號(hào)的被稱為exec格式,反之則稱為shell格式。兩者的區(qū)別可以用以下兩個(gè)Dockerfile來對(duì)比區(qū)分。一句話的解釋就是使用exec格式的話,將按照exec中指定的命令運(yùn)行。使用shell格式化的話,將使用默認(rèn)命令行執(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í)行程序,或者說設(shè)置默認(rèn)執(zhí)行的程序,而CMD指令只指定了程序默認(rèn)執(zhí)行時(shí)使用的參數(shù)。在Docker的官方文檔中有一張非常好的表格羅列各種情況。現(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 |
這張表格里混合了好幾種情況,可以按照縱向列的方式來閱讀。當(dāng)沒有指定ENTRYPOINT時(shí),以CMD中指定的命令和參數(shù)為準(zhǔn)(第一列)。當(dāng)ENTRYPOINT和CMD同時(shí)存在,且ENTRYPOINT以shell格式存在時(shí),以ENTRYPOINT中指定的命令為準(zhǔn)(第二列)。當(dāng)ENTRYPOINT和CMD同時(shí)存在,且都以exec格式存在,則合并ENTRYPOINT和CMD中指定的命令和參數(shù)。
PowerShell及轉(zhuǎn)義符號(hào)PowerShell 首次出現(xiàn)在2006年,它的出現(xiàn)統(tǒng)一了Windows下命令行的設(shè)計(jì)方式,讓管理員和開發(fā)者可以使用動(dòng)詞-名詞的方式來使用開發(fā)命令行工具。PowerShell本身對(duì)標(biāo)Linux的Python,作為膠水語言來簡化操作系統(tǒng)的管理。當(dāng)然Python目前比PowerShell還是領(lǐng)先一些,Web應(yīng)用開發(fā)的能力也是PowerShell所不具備的,這和PowerShell做為管理員工具存在的初始定位有關(guān)。
那么在Dockerfile中如何使用PowerShell呢?這里以一個(gè)Dockerfile為例進(jìn)行說明。首先,通過escape注釋語句設(shè)置本Dockerfile中的轉(zhuǎn)義符號(hào)為倒角符(`)。接下來通過SHELL指令設(shè)置容器內(nèi)默認(rèn)命令行為PowerShell。然后通過RUN指令運(yùn)行PowerShell命令。這里需要注意的是,示例中運(yùn)行的已經(jīng)不是單行命令,而是腳本塊。因此命令之間是通過分號(hào)(;)進(jìn)行分隔的。而為了避免一行命令過長,則使用倒角符截?cái)嗝顓?shù)。
PowerShell如果要展開來討論,做為開發(fā)語言也有很多要討論的地方,在Dockerfile中一般只是用來執(zhí)行現(xiàn)成的命令。同時(shí)需要注意的在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" ]總結(jié)
文章標(biāo)題中使用了出行計(jì)劃來形容Dockerfile之于容器制作的作用。技術(shù)上來說Dockerfile的存在使得開發(fā)人員可以在代碼庫中管理最終交付物的生成過程,比如如果應(yīng)用要發(fā)布到Windows Server, version 1803中,只需更改FROM中使用的基礎(chǔ)鏡像即可。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/27295.html
摘要:最終疊加在一起成為新的鏡像。優(yōu)化的方法就是使用和換行符將多條語句合并成一條執(zhí)行。第一點(diǎn),所有指令在中需要大寫,從而和具體的操作命令區(qū)分開來。第二點(diǎn),對(duì)于過長的指令請(qǐng)合理使用換行符,從而增加的可閱讀性。 前言 有一定旅行經(jīng)驗(yàn)的朋友都知道,即使在出發(fā)前制定了詳細(xì)的出行計(jì)劃,也會(huì)在路途中因?yàn)楦魇礁鳂拥臓顩r而不得不重新修改計(jì)劃。這個(gè)狀況在我們編寫Dockerfile時(shí)一樣存在。花了30分鐘編寫...
閱讀 2171·2023-04-26 00:43
閱讀 2689·2021-11-22 15:22
閱讀 3826·2021-11-11 16:55
閱讀 977·2021-11-04 16:06
閱讀 1792·2019-08-30 14:12
閱讀 1004·2019-08-30 14:02
閱讀 3376·2019-08-29 17:05
閱讀 1421·2019-08-29 12:27