天天看點

docker-使用Dockerfile建立鏡像Dockerfile

文章目錄

  • 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支援參數如下:

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