天天看點

Dockerfile檔案全面詳解

Dockerfile檔案全面詳解

Docker 可以通過讀取 Dockerfile 中的指令自動建構鏡像。Dockerfile 是一個文本文檔,其中包含了使用者建立鏡像的所有指令和說明。

一、 變量

變量用 $variable_name 或者 ${variable_name} 表示。

${variable:-word} 表示如果 variable 設定,則結果将是該值。如果 variable 未設定,word 則将是結果。

${variable:+word} 表示如果 variable 設定則為 word 結果,否則為空字元串。

變量前加 \ 可以轉義成普通字元串:\$foo or \${foo},表示轉換為 $foo 和 ${foo} 文字。

二、FROM

初始化一個新的建構階段,并設定基礎鏡像:

單個 Dockfile 可以多次出現 FROM,以使用之前的建構階段作為另一個建構階段的依賴項

AS name 表示為建構階段命名,在後續 FROM 和 COPY --from=<name> 說明中可以使用這個名詞,引用此階段建構的映像

digest 其實就是就是根據鏡像内容産生的一個 ID,隻要鏡像的内容不變 digest 也不會變

tag 或 digest 值是可選的。如果您省略其中任何一個,建構器預設使用一個 latest 标簽。如果找不到該 tag 值,建構器将傳回錯誤。

--platform 标志可用于在 FROM 引用多平台鏡像的情況下指定平台。例如,linux/amd64、linux/arm64、 或 windows/amd64。

三、RUN

将在目前鏡像之上的新層中執行指令,在 docker build時運作。

RUN 有兩種形式:

RUN<command>(shell 形式,指令在 shell 中運作,預設 /bin/sh -c 在 Linux 或 cmd /S /CWindows 上)

RUN ["executable", "param1", "param2"](執行形式)

說明:

可以使用 \(反斜杠)将單個 RUN 指令延續到下一行

RUN 在下一次建構期間,指令緩存不會自動失效。可以使用 --no-cache 标志使指令緩存無效

Dockerfile 的指令每執行一次都會在 Docker 上建立一層。是以過多無意義的層,會造成鏡像膨脹過大,可以使用 && 符号連接配接指令,這樣執行後,隻會建立 1 層鏡像

四、CMD

運作程式,在 docker run 時運作,但是和 run 指令不同,RUN 是在 docker build 時運作。

支援三種格式:

CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;

CMD command param1 param2 在 /bin/sh 中執行,提供給需要互動的應用;

CMD ["param1","param2"] 提供給 ENTRYPOINT 的預設參數。

指定啟動容器時執行的指令,每個 Dockerfile 隻能有一條 CMD 指令。如果指定了多條指令,隻有最後一條會被執行。

如果使用者啟動容器時候指定了運作的指令,則會覆寫掉 CMD 指定的指令。

五、LABEL

添加中繼資料:

六、EXPOSE

Docker 容器在運作時偵聽指定的網絡端口。可以指定端口是監聽TCP還是UDP,如果不指定協定,預設為TCP。

該 EXPOSE 指令實際上并未釋出端口。要在運作容器時實際釋出端口,docker run -P 來釋出和映射一個或多個端口。

預設情況下,EXPOSE 假定 TCP。您還可以指定 UDP:

七、ENV

設定環境變量:

設定的環境變量将持續存在,您可以使用 docker inspect 來檢視。使用 docker run --env <key>=<value> 來更改環境變量的值。

如果環境變量隻在建構期間需要,請考慮為單個指令設定一個值:

或者使用 ARG,它不會保留在最終鏡像中:

八、ADD

複制新檔案、目錄或遠端檔案 URL <src> ,并将它們添加到 <dest> 中。

<src> 可以指定多個資源,但如果它們是檔案或目錄,則它們的路徑被解釋為相對于建構上下文的源,也就是 WORKDIR。

每個都 <src> 可能包含通配符,比對将使用 Go 的 filepath.Match 規則。例如:

添加所有以“hom”開頭的檔案:

在下面的示例中,? 被替換為任何單個字元,例如“home.txt”。

<dest> 是一個絕對路徑,或相對 WORKDIR 的相對路徑。

九、COPY

文法同ADD一緻,複制拷貝檔案。

COPY 指令和 ADD 指令的唯一差別在于:是否支援從遠端URL擷取資源。COPY 指令隻能從執行 docker build 所在的主機上讀取資源并複制到鏡像中。而 ADD 指令還支援通過 URL 從遠端伺服器讀取資源并複制到鏡像中。

相同需求時,推薦使用 COPY 指令。ADD 指令更擅長讀取本地tar檔案并解壓縮。

十、ENTRYPOINT

ENTRYPOINT 和 CMD 一樣,都是在指定容器啟動程式及參數,不過它不會被 docker run 的指令行參數指定的指令所覆寫。如果要覆寫的話,需要通過 docker run --entrypoint 來指定。

它有2種格式:

指定了 ENTRYPOINT 後, CMD 的内容作為參數傳給 ENTRYPOINT 指令,實際執行時,将變為:

十一、VOLUME

建立一個具有指定名稱的挂載資料卷。

它的主要作用是:

避免重要的資料,因容器重新開機而丢失

避免容器不斷變大

十二、ARG

定義變量,與 ENV 作用相同,不過 ARG 變量不會像 ENV 變量那樣持久化到建構好的鏡像中。

Docker 有一組預定義的 ARG 變量,您可以在 Dockerfile 中沒有相應指令的情況下使用這些變量。

HTTP_PROXY

http_proxy

HTTPS_PROXY

https_proxy

FTP_PROXY

ftp_proxy

NO_PROXY

no_proxy

要使用這些,請使用 --build-arg 标志在指令行上傳遞它們,例如:

十三、ONBUILD

将一個觸發指令添加到鏡像中,以便稍後在該鏡像用作另一個建構的基礎時執行。也就是另外一個 dockerfile FROM 了這個鏡像的時候執行。

十四、STOPSIGNAL

設定将發送到容器退出的系統調用信号。該信号可以是與核心系統調用表中的位置比對的有效無符号數,例如 9,或格式為 SIGNAME 的信号名稱,例如 SIGKILL。

預設的 stop-signal 是 SIGTERM,在 docker stop 的時候會給容器内 PID 為 1 的程序發送這個 signal,通過 --stop-signal 可以設定自己需要的 signal,主要目的是為了讓容器内的應用程式在接收到 signal 之後可以先處理一些事物,實作容器的平滑退出,如果不做任何處理,容器将在一段時間之後強制退出,會造成業務的強制中斷,預設時間是 10s。

十五、HEALTHCHECK

用于指定某個程式或者指令來監控 Docker 容器服務的運作狀态。該 HEALTHCHECK 指令有兩種形式:

HEALTHCHECK [OPTIONS] CMD command(通過在容器内運作指令來檢查容器健康狀況)

HEALTHCHECK NONE(禁用從基礎鏡像繼承的任何健康檢查)

十六、SHELL

覆寫用于指令的 shell 形式的預設 shell。Linux 上的預設 shell 是 ["/bin/sh", "-c"],Windows 上是 ["cmd", "/S", "/C"]。

該 SHELL 指令在 Windows 上特别有用,因為 Windows 有兩種常用且截然不同的本機 SHELL:cmd 和 powershell,以及可用的備用 shell,包括 sh。該 SHELL 指令可以出現多次。每條 SHELL 指令都會覆寫所有先前的 SHELL 指令,并影響所有後續指令。

十七、WORKDIR

工作目錄,如果 WORKDIR 不存在,即使它沒有在後續 Dockerfile 指令中使用,它也會被建立。

docker build 建構鏡像過程中,每一個 RUN 指令都會建立一層。隻有通過 WORKDIR 建立的目錄才會一直存在。

可以設定多個 WORKDIR,如果提供了相對路徑,它将相對于前一條 WORKDIR 指令的路徑。例如:

最終 pwd 指令的輸出是 /a/b/c。

該 WORKDIR 指令可以解析先前使用 ENV,例如:

最終 pwd 指令的輸出是 /path/$DIRNAME。

十八、USER

設定使用者名(或 UID)和可選的使用者組(或 GID)。

原文連結:https://zhuanlan.zhihu.com/p/387855002