成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Windows Containers 大冒險: 出行計劃(Dockerfile)

tomener / 2890人閱讀

摘要:其中指令用于指定在構建新鏡像時將使用的基礎鏡像,通用用途的容器一般可以選擇則或者。這張表格里混合了好幾種情況,可以按照縱向列的方式來閱讀。因此命令之間是通過分號進行分隔的??偨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:/test

ENTRYPOINT 指令

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

相關文章

  • Windows Containers 冒險: 優(yōu)化計劃(Dockerfile)

    摘要:最終疊加在一起成為新的鏡像。優(yōu)化的方法就是使用和換行符將多條語句合并成一條執(zhí)行。第一點,所有指令在中需要大寫,從而和具體的操作命令區(qū)分開來。第二點,對于過長的指令請合理使用換行符,從而增加的可閱讀性。 前言 有一定旅行經(jīng)驗的朋友都知道,即使在出發(fā)前制定了詳細的出行計劃,也會在路途中因為各式各樣的狀況而不得不重新修改計劃。這個狀況在我們編寫Dockerfile時一樣存在。花了30分鐘編寫...

    Enlightenment 評論0 收藏0

發(fā)表評論

0條評論

tomener

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<