Dockerfile創建鏡像


使用Dockerfile可以快速創建自定義鏡像。

一、基本結構

Dockerfile由一行行命令行組成,並且支持以#開頭的注釋行。

Dockerfile主體內容分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。

 

二、指令說明

Dockerfile指令的 一般格式為INSTRUCTION arguments,包括”配置指令“(配置鏡像信息)和“操作指令”(具體執行操作),具體如下圖:

 

 

 1.配置指令

1)ARG

定義創建鏡像過程中使用的變量。

格式:ARG <name>=<value>

在執行docker build時,可以通過-build-arg來為變量復制。當鏡像編譯完成后,ARG指定的變量將不再存在(ENV指定的變量將在鏡像中保留)。

Docker內置了一些鏡像創建變量,用戶可以直接使用而無需聲明。包括(不區分大小寫)HTTP_PROXY、HTTS_PROXY、FTP_PROXY、NO_PROXY。

2)FROM

指定所創建鏡像的基礎信息。

格式:FROM <image> [AS name] 或 FROM <image>:<tag> [AS <name> 或 FROM <image>@<DIGEST> [AS <name>]。

任何Dockerfile中第一條指令必須為FROM指令。如果在同一個Dockerfile中創建多個鏡像時,可以使用多個FROM指令(每個鏡像一次)。

如:

ARG VERSION=1.0
FROM debian:${VERSION}

3)LABEL

LABEL指令可以為生成的鏡像添加元數據標簽信息。這些信息可以用來輔助過濾出特定的鏡像。

格式:LABEL <key>=<value> <key>=<value> <key>=<value>....

如:

LABEL version="1.0" author="hello"

4)EXPOSE

聲明鏡像內服務監聽的端口。

格式:EXPOSE <port>=[<port>/<protocol>......]

如:

EXPOSE 22 808433

注意該指令只是起到聲明作用,並不會自動完成端口映射。

如果要映射端口出來,在啟動容器時可以使用-P參數或-p參數。

5)ENV

指定環境變量,在鏡像生成過程中會被后續的RUN指令使用,在鏡像啟動的容器中也會存在。

格式:ENV <key> <value> 或 ENV <key>=<value>......

指令指定的環境變量在運行時可以被覆蓋,如docker run -env <key>=<value> build_image。

6)ENTRYPOINT

指定鏡像的默認入口命令。該入口命令會在啟動容器時作為根命令執行,所有傳入值作為 該命令的參數。

格式:ENTRYPOINT ["executable", "param1","param2"]:exec調用執行;

   ENTRYPOINT command param1 param2:shell中執行

此時,CMD指令指定值將作為根命令的參數。

每個Dockerfile中只能有一個ENTRYPOINT,當指定多個時只有最后一個起效。

在運行時,可以被--entrypoint參數覆蓋掉,如docker run --entrypoint

7)VOLUME

創建一個數據卷掛載點。

格式:VOLUME ["/data"]。

運行容器時可以從本地主機或其他容器掛載數據卷,一般用來存放數據庫和需要保持的數據等。

8)USER

指定運行容器時的用戶名或UID,后續的RUN等指令也會使用指定的用戶身份。

格式:USER daemon

當服務不需要管理員權限時,可以通過該指令指定運行用戶,並且可以在Dockerfile中創建所需要的用戶,如:

RUN groupadd -r postgree && useradd --no-log-init -r -g postgres postgres

要零食獲取管理員權限可以使用gosu命令。

9)WORKDIR

為后續的RUN、CMD、ENTRYPOINT指令配置工作目錄。

格式:WORKDIR /path/to/workdir

可以使用多個WORKDIR指令,后續命令如果參數是相對路徑,則會基於之前指令指定的路徑。如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

則最終路徑為/a/b/c。

10)ONBUILD

當基於所生成鏡像創建子鏡像時,自動執行的操作指令。

格式:ONBUILD [INSTRUCTION]

11)HEALTHCHECK

配置所啟動容器如何進行健康檢查。

格式:HEALTHCHECK [OPTIONS] CMD command:根據所執行命令返回值是否為0來判斷;

   HEALTHCHECK NONE:禁止基礎鏡像中的健康檢查。

OPTIONS支持如下參數:

  • -interval=DURATION(default 30s):過多久檢查一次;
  • -timeout=DURATION(default 30s):每次檢查等待結果的超時;
  • -retries=N(default 3):如果失敗了,重試幾次才最終確定失敗。

13)SHELL

指定其他命令使用shell時的默認shell類型:SHELL ["executable","parameters"]

默認值為["/bin/sh","-c"]

注意:對於windows系統,Shell路徑中使用了“\”作為分隔符,建議在Dockerfile開頭添加#escape='來指定轉義符。

2.操作指令

1)RUN

運行指定指令。

格式:RUN <command>或RUN ["executable","param1","param2"]。注意后者指令會被解析為JSON數組,因此必須用雙引號。

前者默認將在shell終端中運行命令,即/bin/sh -c;后者則使用exec執行,不會啟動shell環境。

2)CMD

用來指定啟動容器時默認指定的命令。

格式:

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

每個Dockerfile只能由一條CMD命令。如果指定了多條命令,只有最后一條會被執行。

如果用戶啟動容器時手動指定了運行的命令(作為run命令的參數),則會覆蓋掉CMD指定的命令。

3)ADD

將復制指定的<src>路徑下內容到容器中的<dest>路徑下。

其中<src>可以時Dockerfile所在目錄的一個相對路徑(文件或目錄);也可以是一個URL;還可以是一個tar文件(自動解壓為目錄)。<dest>可以時鏡像內絕對路徑,或者相對於工作目錄(WORKDIR)的相對路徑。

路徑支持格式,如:

ADD *.c /code/

4)COPY

復制內容到鏡像。

格式:COPY <src> <dest>

復制本地主機的<src>(為Dockerfile所在目錄的相對路徑,文件或目錄)下內容到鏡像中的<dest>。目標路徑不存在時會自動創建。

路徑同樣支持正則格式。

COPYT於ADD指令功能類似,當使用 本地目錄為源目錄時,推薦使用COPY。

 

三、創建鏡像

編寫完Dockerfile之后,可以通過docker build命令來創建鏡像。

格式:docker build [OPTIONS] PATH [URL]-

該命令將讀取指定目錄下(包括子目錄)的Dockerfile,並將該路徑下所有的數據作為上下文發送給Docker服務端,Docker服務端在校驗Dockerfile格式通過后,逐條執行其中定義的指令,碰到ADD、COPY和RUN指定會生成一層新的鏡像。最終如果創建鏡像成功,會返回最終鏡像的ID。

 如果上下文過大,會導致發送大量數據給服務端,延緩創建 過程。因此除非是生成鏡像所必須的文件,不然不要放到上下文路徑下。如果使用非上下文路徑下的Dockerfile,可以通過-f選項來指定其路徑。

要指定生成鏡像的標簽信息,可以通過-t選項。該選項可以重復使用多次為 鏡像一次添加多個名稱。

1.命令選項

 

 2.使用.dockerignore文件

可以通過.dockerignore文件(每一行 添加一條匹配 模式)來讓Docker忽略匹配路徑或文件,在創建鏡像時不將無關數據發送到服務端。

3.多步驟創建

自17.05版本 開始,Docker支持多步驟創建鏡像特性,可以精簡最終生成的鏡像大小。

 

四、注意點

  • 精簡鏡像用途:
  • 選用合適的基礎鏡像
  • 提供注釋和維護者信息
  • 正確使用版本號
  • 減少 鏡像層數
  • 恰當使用多步驟創建
  • 使用.dockerignore文件
  • 及時刪除臨時文件 和緩存文件
  • 提高生成速度
  • 調整合理的指令順序
  • 減少外部源的干擾

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM