国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

tomener / 2882人閱讀

摘要:其中指令用于指定在構建新鏡像時將使用的基礎鏡像,通用用途的容器一般可以選擇則或者。這張表格里混合了好幾種情況,可以按照縱向列的方式來閱讀。因此命令之間是通過分號進行分隔的。總結文章標題中使用了出行計劃來形容之于容器制作的作用。

前言

在有了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:/test

ENTRYPOINT 指令

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

相關文章

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

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

    Enlightenment 評論0 收藏0

發表評論

0條評論

tomener

|高級講師

TA的文章

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