Dockerfile學習

23云恋49枫發表於2024-09-09

1、Dockerfile 基本命令

FROM 指定基礎映象
RUN 執行命令
COPY 複製檔案
ADD 更高階的複製檔案
CMD 用於指定容器啟動時要執行的預設命令
ENTRYPOINT 容器執行過程的起點
ENV 設定環境變數
ARG 用於指定容器啟動時要執行的預設命令
VOLUME 定義匿名卷
EXPOSE 需要暴露的埠
WORKDIR 指定工作目錄
USER 指定當前使用者
HEALTHCHECK 定義健康檢查
ONBUILD 為映象新增觸發器
LABEL 新增後設資料標籤
STOPSIGNAL 停止容器時傳送的訊號 
SHELL 指定在執行RUN、CMD和ENTRYPOINT指令時使用的shell直譯器

注意:

Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成映象膨脹過大。

FROM 指定基礎映象

FROM 指令用於指定其後構建新映象所使用的基礎映象。FROM 指令必是 Dockerfile 檔案中的首條命令,啟動構建流程後,Docker 將會基於該映象構建新映象,FROM 後的命令也會基於這個基礎映象。

語法格式如下:

FROM <image>
# 或
FROM <image>:<tag>
# 或
FROM <image>:<digest>

FROM 有以下限制:

1、FROM 必須 是 Dockerfile 中第一條非註釋命令。

2、在一個 Dockerfile 檔案中建立多個映象時,FROM 可以多次出現。只需在每個新命令 FROM 之前,記錄提交上次的映象 ID。

3、tag 或 digest 是可選的,如果不使用這兩個值時,會使用 latest 版本的基礎映象。

RUN 執行命令

RUN 指令在映象的構建過程中執行特定的命令,並生成一箇中間映象。

RUN 命令將在當前 image 中執行任意合法命令並提交執行結果。命令執行提交後,就會自動執行 Dockerfile 中的下一個指令。

RUN 指令建立的中間映象會被快取,並會在下次構建中使用。如果不想使用這些快取映象,可以在構建時指定 --no-cache 引數,如:docker build --no-cache

語法格式如下(有兩種格式):

1、RUN <命令列命令>
# <命令列命令> 等同於,在終端操作的 shell 命令。

2、RUN ["可執行檔案", "引數1", "引數2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等價於 RUN ./test.php dev offline

COPY 複製檔案

複製指令,從上下文目錄中複製檔案或者目錄到容器裡指定路徑。

指令從 <源路徑1> 複製新的檔案或目錄,並將它們新增到 Docker 容器檔案系統的 <目標路徑> 的路徑下。

語法格式如下:

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

引數說明:
1、[--chown=<user>:<group>]:可選引數,使用者改變複製到容器內檔案的擁有者和屬組。
2、<目標路徑>:容器內的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動建立。
3、<源路徑>:原始檔或者源目錄,這裡可以是萬用字元表示式,其萬用字元規則要滿足 Go 的 filepath.Match 規則。例如
	COPY hom* /mydir/
	COPY hom?.txt /mydir/

ADD 指令和 COPY 指令的格式和性質基本一致,但是在 COPY 基礎上增加了一些功能。

1、ADD指令可以讓你使用 URL 作為 <源路徑1> 引數。當遇到 URL 時候,可以透過 URL 下載檔案並且複製到 <目標路徑>(容器中目標路徑)。
2、ADD的另一個特性是自動解壓檔案的能力。如果 <源路徑1> 引數是一個可識別壓縮格式(tar, gzip, bzip2…)的本地檔案(注:無法實現同時下載並解壓),就會被解壓到指定容器檔案系統的路徑 <目標路徑> 下。

CMD

類似於 RUN 指令,用於執行程式,但二者執行的時間點不同:

CMD 在 docker run 時執行,在構建時不進行任何操作。如果 Dockerfile 中如果存在多個 CMD 指令,僅最後一個生效。

RUN 是在 docker build,並生成一個新的映象。

語法格式如下(有三種格式):

CMD <shell 命令> 

CMD ["<可執行檔案或命令>","<param1>","<param2>",...] 

CMD ["<param1>","<param2>",...]  # 該寫法是為 ENTRYPOINT 指令指定的程式提供預設引數

推薦使用第二種格式,執行過程比較明確。第一種格式實際上在執行的過程中也會自動轉換成第二種格式執行,並且預設可執行檔案是sh。

ENTRYPOINT

ENTRYPOINT 用於給容器配置一個可執行程式。也就是說,每次使用映象建立容器時,透過 ENTRYPOINT 指定的程式都會被設定為預設程式。

類似於 CMD 指令,但其不會被 docker run 的命令列引數指定的指令所覆蓋,而且這些命令列引數會被當作引數送給 ENTRYPOINT 指令指定的程式。

但是,如果執行 docker run 時使用了 --entrypoint 選項,將覆蓋 ENTRYPOINT 指令指定的程式。

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

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

語法格式如下:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是變參才會使用 CMD ,這裡的 CMD 等於是在給 ENTRYPOINT 傳參。

ENV 設定環境變數

設定環境變數,定義了環境變數,那麼在後續的指令中,就可以使用這個環境變數。

語法格式如下(有兩種格式):

ENV <key> <value>

ENV <key1>=<value1> <key2>=<value2>...
這個指令很簡單,就是設定環境變數而已,無論是後面的其它指令,如 RUN,還是執行時的應用,都可以直接使用這裡定義的環境變數。

ENV VERSION=1.0 DEBUG=on \
    NAME="Happy Feet"

ARG

構建引數,與 ENV 作用一致。不過作用域不一樣。ARG 設定的環境變數僅對 Dockerfile 內有效,也就是說只有 docker build 的過程中有效,構建好的映象內不存在此環境變數。
構建命令 docker build 中可以用 --build-arg <引數名>=<值> 來覆蓋。

語法格式如下:

ARG <引數名>[=<預設值>]

VOLUME 定義匿名卷

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

EXPOSE

  • 為構建的映象設定監聽埠,使容器在執行時監聽(僅僅只是宣告埠)。
  • 作用:
    • 幫助映象使用者理解這個映象服務的守護埠,以方便配置對映。
    • 在執行時使用隨機埠對映時,也就是 docker run -P 時,會自動隨機對映 EXPOSE 的埠。

語法格式如下:

EXPOSE <port> [<port>...]

WORKDIR 指定工作目錄

指定工作目錄。用 WORKDIR 指定的工作目錄,會在構建映象的每一層中都存在。以後各層的當前目錄就被改為指定的目錄,如該目錄不存在,WORKDIR 會幫你建立目錄。
docker build 構建映象過程中的,每一個 RUN 命令都是新建的一層。只有透過 WORKDIR 建立的目錄才會一直存在。

語法格式如下:

WORKDIR <工作目錄路徑>

USER 指定當前使用者

用於指定執行後續命令的使用者和使用者組,這邊只是切換後續命令執行的使用者(使用者和使用者組必須提前已經存在)。

語法格式如下:

USER <使用者名稱>[:<使用者組>]

HEALTHCHECK

用於指定某個程式或者指令來監控 docker 容器服務的執行狀態。

語法格式如下:

HEALTHCHECK [選項] CMD <命令>:設定檢查容器健康狀況的命令
HEALTHCHECK NONE:如果基礎映象有健康檢查指令,使用這行可以遮蔽掉其健康檢查指令

HEALTHCHECK [選項] CMD <命令> : 這邊 CMD 後面跟隨的命令使用,可以參考 CMD 的用法。

https://blog.csdn.net/m0_51913750/article/details/131563704

相關文章