文章目錄
- Dockerfile
-
- 基本結構
- 指令說明
-
- 配置指令
-
- ARG
- FROM
- LABEL
- EXPOSE
- ENV
- ENTRYPOINT
- VOLUME
- USER
- WORKDIR
- ONBUILD
- STOPSIGNAL
- HEALTHCHECK
- SHELL
- 操作指令
-
- RUN
- CMD
- ADD
- COPY
Dockerfile
Dockerfile是一個文本格式的配置檔案,使用者可以使用Dockerfile來快速建立自定義的鏡像。
Docker — 從入門到實踐
基本結構
Dockerfile由一行行指令語句組成,并且支援以 # 開頭的注釋行。
一般而言, Dockerfile 主體内容分為四部分:基礎鏡像資訊、 維護者資訊、 鏡像操作指
令和容器啟動時執行指令。
指令說明
配置指令
ARG
定義建立鏡像過程中使用的變量。
格式:
ARG <name>[=<default value>]
建構參數和 ENV 的效果一樣,都是設定環境變量。所不同的是,ARG 所設定的建構環境的環境變量,在将來容器運作時是不會存在這些環境變量的。但是不要是以就使用 ARG 儲存密碼之類的資訊,因為 docker history 還是可以看到所有值的。
Dockerfile 中的 ARG 指令是定義參數名稱,以及定義其預設值。該預設值可以在建構指令 docker build 中用 --build-arg <參數名>=<值> 來覆寫。
Docker 内置了一些鏡像建立變量, 使用者可以直接使用而無須聲明, 包括(不區分大小
寫) HTTP PROXY 、 HTTPS PROXY 、 FTP PROXY 、 NO PROXY。
FROM
指定所建立鏡像的基礎鏡像,如果本地不存在,則預設會去Docker Hub下載下傳指定鏡像。
格式:
FROM <image>
,或
FROM <image>:<tag>
,或
FROM<image>@<digest>
。
任何 Dockerfile 中第一條指令必須為FROM 指令。 并且, 如果在同一個Dockerfile 中創
建多個鏡像時, 可以使用多個 FROM 指令(每個鏡像一次)。
為了保證鏡像精簡, 可以選用體積較小的鏡像如Alpine或Debian 作為基礎鏡像。 例如:
ARG VERSION=9.3
FROM debian:${VERSION}
LABEL
LABEL 指令可以為生成的鏡像添加中繼資料标簽資訊。 這些資訊可以用來輔助過濾出特
定鏡像。
格式:
LABLE <key>=<value> <key>=<value> <key>=<value> ···
例如:
LABEL version=“v0.1”
LABEL author=“[email protected]” date=“2020-01-01”
LABEL description=“test”
EXPOSE
聲明鏡像内服務監聽的端口。
格式為:
EXPOSE <port> [<port>/protocol> ···]
例如:EXPOSE 8080 80 3306
注意該指令隻是起到聲明作用, 并不會自動完成端口映射。
如果要映射端口出來, 在啟動容器時可以使用 -P 參數 (Docker 主機會自動配置設定一個宿主
機的臨時端口)或-p HOST_PORT:CONTAINER_PORT 參數(具體指定所映射的本地端口)。
ENV
指定環境變量, 在鏡像生成過程中會被後續RUN指令使用, 在鏡像啟動的容器中也會存在。
格式:
ENV <key> <value>
或
ENV <key>=<value>
···
指令指定的環境變量在運作時可以被覆寫掉, 如 docker run --env <key>=<value>
built_image
注意當一條 ENV 指令中同時為多個環境變量指派并且值也是從環境變量讀取時, 會為
變量都指派後再更新。
ENTRYPOINT
指定鏡像的預設入口指令, 該入口指令會在啟動容器時作為根指令執行, 所有傳人值作
為該指令的參數。
支援兩種格式:
- ENTRYPOINT [“executable”, “param1”, “param2”]:exec調用執行
- ENTRYPOINT command param1 param2:shell中執行
此時, CMD指令指定值将作為根指令的參數。
每個 Dockerfile 中隻能有一個 ENTRYPOINT, 當指定多個時, 隻有最後一個起效。
在運作時, 可以被 --entrypoint 參數覆寫掉, 如 docker run --entrypoint。
VOLUME
建立一個資料卷挂載點。
格式:
VOLUME ["/data"]
運作容器時可以從本地主機或其他容器挂載資料卷, 一般用來存放資料庫和需要保持的
資料等。
USER
指定運作容器時的使用者名或urn, 後續的RUN等指令也會使用指定的使用者身份。
格式:
USER daemon
當服務不需要管理者權限時,可以通過該指令指定運作使用者, 并且可以在 Dockerfile中建立所需要的使用者。例如:
RUN groupadd -r postgres && useradd --no-log-init -r -g postgres postgres
要臨時擷取管理者權限可以使用 gosu 指令。
WORKDIR
為後續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。
格式:
WORKDIR /path/to/workdir
可以使用多個 WORKDIR 令,後續指令如果參數是相對路徑,則會基于之前指令指定
的路徑。
例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終路徑為 /a/b/c
是以,為了避免出錯,推薦 WORKDIR 指令中隻使用絕對路徑。
ONBUILD
指定當基于所生成鏡像建立子鏡像時,自動執行的操作指令。也就是隻有當以目前鏡像為基礎鏡像,去建構下一級鏡像的時候才會被執行。
Dockerfile 中的其它指令都是為了定制目前鏡像而準備的,唯有 ONBUILD 是為了幫助别人定制自己而準備的。
格式:
ONBUILD [INSTRUCTION]
例如:ONBUILD RUN /usr /local/bin/python-build --dir /app/src
等價子鏡像執行如下指令:RUN /usr /local/bin/python-build --dir /app/src
由于 ONBUILD 指令是隐式執行的,推薦在使用它的鏡像标簽中進行标注, 例如 ruby:2.1-onbuild
ONBUILD 指令在建立專門用于自動編譯、檢查等操作的基礎鏡像時,十分有用。
STOPSIGNAL
指定所建立鏡像啟動的容器接收退出的信号值:
STOPSIGNAL signal
HEALTHCHECK
配置所啟動容器如何進行健康檢查(如何判斷健康與否),自 Docker 1.12 開始支援。
格式有兩種:
- HEALTHCHECK [OPTIONS] CMD command:根據所執行指令傳回值是否為0來判斷;
-
HEALTHCHECK NONE:禁止基礎鏡像中的健康檢查。
OPTION支援參數如下:
:兩次健康檢查的間隔,預設為 30 秒;--interval=<間隔>
:健康檢查指令運作逾時時間,如果超過這個時間,本次健康檢查就被視為失敗,預設 30 秒;--timeout=<時長>
:當連續失敗指定次數後,則将容器狀态視為 unhealthy,預設 3 次。--retries=<次數>
SHELL
指定其他指令使用shell時的預設shell類型:
格式:
SHELL ["executable", "parameters"]
預設值為:["/bin/sh", “-c”]
操作指令
RUN
運作指定指令。
格式:
RUN <command>
或
RUN ["executable", "param1", "param2"]
。注意後者指令會被解析為JSON數組,是以必須用雙引号。前者預設将在 shell 終端中運作指令,即 /bin/sh -c ;後者則使用 exec 執行,不會啟動 shell 環境。
指定使用其他終端類型可以通過第二種方式實作,例如:RUN ["/bin/bash", “-c”, “echo hello”]
每條 RUN 指令将在目前鏡像基礎上執行指定指令,并送出為新的鏡像層。當指令較長時
可以使用\來換行。
CMD
CMD 指令用來指定啟動容器時預設執行的指令。
支援三種格式:
-
:相當于執行 executable param1 param2,推薦方法;CMD ["executable", "param1", "param2"]
-
:在預設的 Shell 中執行,提供給需要互動的應用;CMD command param1 param2
-
:提供給 ENTRYPOINT 的預設參數。CMD ["param1","param2"]
每個 Dockerfile 隻能有一條 CMD 指令。如果指定了多條指令,隻有最後一條會被執行。
如果使用者啟動容器時候手動指定了運作的指令(作為run指令的參數),則會覆寫掉CMD 指定的指令。
ADD
添加内容到鏡像。
格式:
ADD <src> <dest>
該指令将複制指定的
<src>
路徑下内容到容器中的
<dest>
路徑下。
其中
<src>
可以是 Dockerfile 所在目錄的一個相對路徑(檔案或目錄);也可以是一個URL ;還可以是一個 tar 檔案(自動解壓為目錄)
<dest>
可以是鏡像内絕對路徑,或者相對于工作目錄(WORKDIR )的相對路徑.
路徑支援正則格式,例如:
ADD *.c /code/
最适合使用 ADD 的場合,就是所提及的需要自動解壓縮的場合。ADD 指令會令鏡像建構緩存失效,進而可能會令鏡像建構變得比較緩慢。
是以在 COPY 和 ADD 指令中選擇的時候,可以遵循這樣的原則,所有的檔案複制均使用 COPY 指令,僅在需要自動解壓縮的場合使用 ADD。
在使用該指令的時候還可以加上 --chown=<user>:<group> 選項來改變檔案的所屬使用者及所屬組。
COPY
複制内容到鏡像。
格式:
COPY <src> <dest>
複制本地主機的
<src>
(為 Dockerfile 所在目錄的相對路徑,檔案或目錄)下内容到鏡像中的
<dest>
。目标路徑不存在時,會自動建立。
路徑同樣支援正則格式。
COPY與ADD 指令功能類似,當使用本地目錄為源目錄時,推薦使用 COPY。