日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dockerfile语法简介(精)

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dockerfile语法简介(精) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Dockerfile是由一系列命令和參數構成的腳本,一個Dockerfile里面包含了構建整個image的完整命令。Docker通過docker build執行Dockerfile中的一系列命令自動構建image。

# :代表注釋

一、 FROM

Syntax:

FROM <image>[:<tag> | @<digest>] [AS <name>]
  • FROM指定一個基礎鏡像,且必須為Dockerfile文件開篇的每個非注釋行,至于image則可以是任何合理存在的image鏡像

  • FROM可以在一個Dockerfile中出現多次,以便于創建混合的images。如果沒有指定tag,latest將會被指定為要使用的基礎鏡像版本。

  • AS name,可以給新的構建階段賦予名稱。該名稱可用于后續FROM 和 COPY --from=<name | index>說明可以引用此階段中構建的鏡像

?

二、LABEL

為鏡像生成元數據標簽信息
Syntax:

LABEL <KEY>=<VALUE> \<KEY>="XXXX"

多個標簽寫成一行,避免在鏡像中額外增加layer

?

三、MAINTAINER

作者信息,寫在FROM后
Syntax:

MAINTAINER "auth <email>"

?

四、COPY

當復制一個目錄時,并不會復制目錄本身,而是會遞歸復制其下子目錄 至目標目錄下 **Syntax:** ``` COPY data /data/ ```

文件復制準則

  • <src>必須是build上下言文中的路徑,不能是其父目錄中的文件
  • 如果<src>是目錄,則其內部文件或子目錄會被遞歸復制,但<src>目錄自身不會被復制
  • 如果指定了多個<src>,或在<src>中使用了通配符,則<dest>必須是一個目錄,且必須以/結尾
  • 如果<dest>事先不存在,它將會被自動創建,這包括其父目錄路徑。

?

五、ADD

?

ADD指令類似于COPY指令,ADD支持使用TAR文件和URL路徑

Syntax:

ADD <src>...<dest> ADD ["<src>",..."<dest>"]

操作準則

  • 如果<src>為URL且<dest>不以/結尾,則<src>指定的文件將被下載并直接被創建為<dest>;如果<dest>以/結尾,則文件名URL指定的文件將被直接下載并保存為<dest>/<filename>
  • 如果<src>是一個本地文件系統上的壓縮格式的tar文件,它將被展開為一個目錄,其行為類似于"tar -x"命令;然而,通過URL獲取到的tar文件將不會自動展開。
  • 如果<src>有多個,或其間接或直接使用了通配符,則<dest>必須是一個以/結尾的目錄路徑;如果<dest>不以/結尾,則其被視作一個普通文件,<src>內容將被直接寫入到<dest>
  • 為了讓鏡像盡量小,最好不要使用 ADD 指令從遠程 URL 獲取包,而是使用 curl 和 wget。這樣你可以在文件提取完之后刪掉不再需要的文件來避免在鏡像中額外添加一層。
    示例:
額外操作: ADD http://example.com/1.tar.gz /apps/ RUN tar xf /apps/1.tar.gz -C /apps/ && \/bin/sh -c /apps/***.sh簡單操作: RUN mkdir -p /iyunwen/server/ && \curl -SL http://example.com/1.tar.gz \| tar -xzC /iyunwen/server/ && \/bin/sh -c /apps/***.sh

?

六、WORKDIR

?

用于為Dockerfile中所有RUN、CMD、ENTRYPOINT、COPY和ADD指令設定工作目錄 **Syntax:** ``` WORKDIR?```

在Dockerfile文件中,WORKDIR指令可以出現多次,其路徑也可以為相對路徑,不過,其是相對此前一個WORKDIR指令指定的路徑
另外,WORKDIR也可調用由ENV指定定義的變量

ex:

WORKDIR /var/logWORKDIR $STATEPATH

?

七、RUN

?

接受命令作為參數并用于創建鏡像,在之前的commit層上形成新的層。 **Syntax:** ``` RUN \(如同執行shell命令 /bin/sh -c) RUN ["executable","param1","param2"] ```

  • RUN 指令將在當前image中執行任意合法命令并提交執行結果。命令執行提交后,就會自動執行Dockerfile中的下一個指令。
  • 分層RUN指令和生成提交符合Docker的核心概念,其中提交很輕量,可以從image將用于Dockerfile中的下一步。
  • exec形式使得可以避免shell字符串變化,以及使用不包含指定的shell可執行文件的基本image來運行RUN命令。
  • 在shell形式中,可以使用\(反斜杠)將單個RUN指令繼續到下一行。例如: RUN yum install -y \openssl \pcre-devel \zlib
  • 第二種語法格式中的參數是一個JSON格式的數組,其中<executable>為要運行的命令,后面的<paramN>為傳遞給命令的選項或對數;然而,此種格式指定的命令不會以"/bin/sh -c"來發起,因此常見的shell操作如變量替換以及通配符(?,*等)替換將不會進行;不過,如果要運行的命令依賴于此shell特性的話,可以將其替換為類似下面的格式。
RUN ["/bin/bash","-c","<executable>","<param1>"]

RUN 指令的緩存在下一次構建期間不會自動失效。用于諸如:yum repolist 之類的指令的緩存將在下一次構建期間被重用。可以通過--no-cache 參數來使RUN指令的緩存無效,例如: docker build --no-cache

管理命令
某些RUN 命令依賴于使用管道字符( | )將管道輸出到另一個命令功能

RUN wget -O - http://www.baidu.com/index.html | wc -l > /app/html/baidu.html

Docker使用 /bin/sh -c 解釋執行這些命令,解釋器只評估管道中最后一個操作的退出代碼以確定成功。在上面的例子中,只要wc -l 命令成功,即使wget 命令失敗,該構建步驟也會成功并生成新的鏡像。

由于管道中任何階段的錯誤而導致命令失敗,請預先 set -o pipefail && 確保意外錯誤可防止構建無意中成功。例如:
set -o pipefail : 表示在管道連接的命令序列中,只要有任何一個命令返回非0值,則整個管道返回非0值,即使最后一個命令返回0.

RUN set -o pipefail && wget -O - http://www.baidu.com/index.html | wc -l > /app/html/baidu.html

注意:

并非所有的shell都支持 -o pipefail 選項。在這種情況下(例如 dash shell,這是基于Debian的映像上的默認shell),請考慮使用exec形式RUN來明確選擇一個支持該pipefail選項的shell。如:

RUN ["/bin/bash","-c","set -o pipefail && wget -O - http://www.baidu.com/index.html | wc -l > /app/html/baidu.html"]

?

八、CMD?

類似于RUN指令,CMD指令也可用于運行任何命令或應用程序,不過,二者的運行時間點不同

  • RUN 指令運行于映像文件構建過程中,而CMD指令運行于基于Dockerfile構建出的新鏡像文件啟動一個容器時。
  • CMD指令的首要目的在于為啟動的容器指定默認要運行的程序,且其運行結束后,容器也將終止;不過,CMD指定的命令其可以被docker run的命令行選項所覆蓋
  • 在Dockerfile中可以存在多個CMD指令,但僅最后一個生效

Syntax:

CMD <command> //支持命令展開,但是不支持傳遞信號 CMD ["<executable>","<param1>","<param2>"] //相當于容器的第一個命令,可以接受信號 CMD ["param1","param2"] 前兩種語法格式的意義同RUN 第三種則用于為ENTRYPOINT指令提供默認參數

CMD會在啟動容器的時候執行,build時不執行,而RUN只是在構建鏡像的時候執行,后續鏡像構建完成之后,啟動容器就與RUN無關了。這個命令就相當于在/etc/rc.d/rc.local中寫命令

?

九、ENTRYPOINT

類似CMD指令的功能,用于為容器指定默認運行程序,從而使得容器像是一具單獨的可執行程序 與CMD不同的是,由ENTRYPOINT啟動的程序不會被docker run命令行指定的參數所覆蓋,而且,這些命令行參數會被當作參數傳遞給ENTRYPOINT指定的程序。不過,docker run 命令的--entrypoint 選項的參數可覆蓋ENTRYPOINT指令指定的程序

Syntax:

ENTRYPOINT <command> //這種方式能接受shell命令行展開 ENTRYPOINT ["<executable>","param1"] //展開不了,但能接收到信號

docker run命令傳入的命令參數會覆蓋CMD指令的內容并且附加到ENTRYPOINT命令最后做為其參數使用。Dockerfile文件中也可以存在多個ENTRYPOINT指令,但僅有最后一個會生效

?

十、EXPOSE

?用來指定端口,使容器內的應用可以通過端口和外界交互。 **Syntax:** ``` EXPOSE?[...] ```

告訴Docker服務端容器對外映射的本地端口,需要在docker run 的時候使用-p 或者 -P 選項生效。

EXPOSE 80/tcp

?

十一、ENV

ENV指令可以用于docker容器設置環境變量 **Syntax:** ``` ENV?ENV?=?... ```

指定一個環境變量,會被后續RUN指令使用,并在容器運行時保留。
ENV設置的環境變量,可以使用 docker inspect 命令來查看。同時還可以使用 docker run --env <key>=<value>來修改環境變量

?

十二、USER

用于指定運行image時的或運行Dockerfile中任何RUN、CMD或ENTRYPOINT指令指定的程序時的用戶名或UID 默認情況下,container的運行身份為root用戶 **Syntax:** ``` USER?|?``` 需要注意的是,\可以為任意數字,但實踐中其必須為/etc/passwd中某用戶的有效UID,否則,docker run命令將運行失敗

?

十三、ONBUILD

用于在Dockerfile中定義一個觸發器 Dockerfile用于build映像文件,此映像文件亦可作為base image被另一個Dockerfile用作FROM指令的參數,并以之構建新的映像文件 在后的這個Dockerfile中的FROM指令在build過程中被執行時,將會“觸發”創建其base image的Dockerfile文件中的ONBUILD指令定義的觸發器

Syntax:

ONBUILD <INSTRUCTION>

注意:
盡管任何指令都可注冊成為觸發器指令,但ONBUILD不能自我嵌套,且不會觸發FROM和MAINTAINER指令
使用包含ONBUILD指令的Dockerfile構建的鏡像應該使用特殊的標簽,例如ruby:2.0-onbuild
在ONBUILD指令中使用ADD或COPY指令應該格外小心,因為新構建過程和上下文在缺少指定的源文件時會失敗。

?

十四、HEALTHCHECK

Docker 1.12版本后引入的判斷容器狀態是否正常

Syntax:

HEALTHCHECK [OPTION] CMD <command> //設置檢查容器健康狀況的命令 HEALTHCHECK NONE //如果基礎鏡像有健康檢查指令,使用這行可屏蔽掉其健康檢查指令

在沒HEALTHCHECK指令前,Docker只能通過容器內主進程是否退出來判斷容器是否狀態異常。很多情況下這沒問題,但是如果程序進入死鎖狀態,或者死循環狀態,應用進程并不退出,但是該容器已經無法提供服務了。雖然后端的程序可以通過前端的檢測工具來檢查狀態信息。但是最前端的服務就需要本身的檢測機制加上監控,就可以做到出現問題解決問題。

當在一個鏡像指定了 HEALTHCHECK 指令后,用其啟動容器,初始狀態會為 starting,在 HEALTHCHECK 指令檢查成功后變為 healthy,如果連續一定次數失敗,則會變為 unhealthy。

HEALTHCHECK支持下列選項:

  • --interval=<間隔> : 兩次健康檢查間隔,默認30秒
  • --timeout=<時長> : 健康檢查命令運行超時時間,如果超過這個時間,本次健康檢查就被視為失敗,默認為30秒
  • --retries=<次數> :當連續失敗指定次數后,則將容器狀態視為unhealthy,默認3次。

和CMD、ENTRYPOINT一樣,HEALTHCHECK只可以出現一次,如果寫了多個,只有最后一個生效。CMD 后面的命令也分為shell和exec格式。命令的返回值決定了該次檢查的成功與否:?0表示成功;1表示失敗;2保留。

ex:

HEALTHCHECK --interval=5s --timeout=3s \CMD curl -fs http://localhost/ || exit 1

?

總結

以上是生活随笔為你收集整理的Dockerfile语法简介(精)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。