docker-使用Dockerfile創建鏡像

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@github” 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支持參數如下:
    --interval=<間隔>:兩次健康檢查的間隔,默認爲 30 秒;
    --timeout=<時長>:健康檢查命令運行超時時間,如果超過這個時間,本次健康檢查就被視爲失敗,默認 30 秒;
    --retries=<次數>:當連續失敗指定次數後,則將容器狀態視爲 unhealthy,默認 3 次。

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 指令用來指定啓動容器時默認執行的命令。
支持三種格式:

  • CMD ["executable", "param1", "param2"] :相當於執行 executable param1 param2,推薦方法;
  • CMD command param1 param2:在默認的 Shell 中執行,提供給需要交互的應用;
  • CMD ["param1","param2"] :提供給 ENTRYPOINT 的默認參數。

每個 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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章