天天看點

Docker——Dockerfile相關知識點

定義:Dockerfile用來建構鏡像的文本文檔,文本文檔包含了建構鏡像所需的指令和說明。

建構好的鏡像内會有一個 /usr/share/nginx/html/index.html的檔案。

在一個空目錄下,建立一個名為Dockerfile的檔案,并添加下面内容:

FROM nginx

RUN echo '建構nginx鏡像' 〉 /usr/share/nginx/html/index.html

FROM:定制的鏡像都是基于 FROM 的鏡像,這裡的 nginx 就是定制需要的基礎鏡像。後續的操作都是基于 nginx。

RUN:用于執行後續指令,有以下2種格式:

shell格式:RUN <指令行指令>

# <指令行指令> 等同于,在終端操作的 shell 指令。

exec格式:RUN["可執行檔案","參數1","參數2"]

# RUN ["./test.php", "dev", "offline"] 等價于 RUN ./test.php dev offline

建構鏡像:docker build -t nginx:test .

          “.”表示上下文路徑,是指docker在建構鏡像,有時候需要使用本機的檔案,docker build指令得知

          這個路徑之後,會将路徑下的所有内容打包。

解析:docker的運作模式為C/S,本機為C,docker引擎是S。實際的建構過程在docker引擎下完成,需要

          把我們本機的指定目錄下的檔案打包提供給docker引擎使用。如果未說明最後一個參數,

          預設的上下文路徑就是dockerfile所在的目錄。

指令詳解:

COPY [--chown=<user>:<group>] <源路徑1> ... <目标路徑>

COPY [--chown=<user>:<group>] ["源路徑1" ... "目标路徑"]

[--chown=<user>:<group>]:可選參數,使用者改變複制到容器内檔案的擁有者和屬組。

<源路徑>:源檔案或者源目錄,這裡可以是通配符表達式,其通配符規則要滿足 Go 的 filepath.Match 規則

<目标路徑>:容器内的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動建立。

ADD:與COPY使用的格式一緻,功能也類似,不同之處在于:

ADD 的優點:在執行 <源檔案> 為 tar 壓縮檔案的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,

            會自動複制并解壓到 <目标路徑>。

ADD 的缺點:在不解壓的前提下,無法複制 tar 壓縮檔案。會令鏡像建構緩存失效,

            進而可能會令鏡像建構變得比較緩慢。具體是否使用,可以根據是否需要自動解壓來決定。

CMD:類似于RUN,CMD 在docker run 時運作。RUN 在 docker build時運作。

作用:為啟動的程式指定預設要運作的程式,程式運作結束,容器也結束。

        CMD 指令指定的程式可被 docker run 指令行參數中指定要運作的程式所覆寫。

        如果Dockerfile中存在多個CMD指令,僅最後一個生效。

ENTRYPOINT:類似于 CMD 指令,但其不會被 docker run 的指令行參數指定的指令所覆寫,

                          而且這些指令行參數會被當作參數送給 ENTRYPOINT 指令指定的程式。

                          但是, 如果運作 docker run 時使用了 --entrypoint 選項,

                          此選項的參數可當作要運作的程式覆寫 ENTRYPOINT 指令指定的程式。

               優點:在執行 docker run 的時候可以指定 ENTRYPOINT 運作所需的參數。

                          如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最後一個生效。

ENV:設定環境變量

ARG:作用與ENV一樣,不過作用域不一樣,ARG設定的環境變量僅在Dockerfile内有效,

            即隻在docker build的過程中有效,在建構好的鏡像内不存在此環境變量。

VOLUME:定義匿名資料卷。在啟動容器時忘記挂載資料卷,會自動挂載到匿名卷。

        作用:(1)避免重要資料因重起而丢失。(2)避免容器不斷變大。

EXPOSE:聲明端口。

  作用:(1)幫助鏡像使用者了解這個鏡像服務的端口,以友善配置映射。

          (2)在運作時使用随機端口(docker run -P),會自動随機映射EXPOSE的端口。

WORKDIR:指定工作目錄。必須提前建好,會在建構鏡像的每一層中都存在。

USER:用于指定執行後續指令的使用者和使用者組,必須提前存在。

HEALTHCHECK:用于指定某個程式或者指令來監控docker容器的運作狀态。

ONBUILD:用于延遲建構指令的執行。在Dockerfile裡用ONDBUILD指定的指令,在本次建構鏡像的過程中不會執行。

參考:https://www.runoob.com/docker/docker-dockerfile.html