使用Dockerfile建立鏡像

       Dockerfile是一個文本格式的配置文件,用戶可使用Dockerfile來快速建立自定義的鏡像。docker

1、基本結構

       Dockerfile由一行行命令語句組成,而且支持以#開頭的註釋行。shell

       通常而言,Dockerfile分爲四部分:基礎鏡像信息、維護者信息、鏡像操做指令和容器啓動時執行命令。數據庫

       一開始必須指明所基於的鏡像名稱,接下來通常是說明維護者信息。後面則是鏡像操做指令,例如RUN指令,RUN指令將對鏡像執行跟隨的命令。每運行一條RUN指令,鏡像就添加新的一層,並提交。最後是CMD指令,用來指定運行容器時的操做命令。數組

2、指令說明

       指令的通常格式爲INSTRUCTION arguments,指令包括:緩存

       FROM:指定所建立鏡像的基礎鏡像bash

       MAINTAINER:指定維護者信息post

       RUN:運行命令ui

       CMD:指定啓動容器時默認執行的命令table

       LABEL:指定生成鏡像的元數據標籤信息容器

       EXPOSE:聲明鏡像內服務所監聽的端口

       ENV:指定環境變量

       ADD:複製指定的<src>路徑下的內容到容器中的<dest>路徑下,<src>能夠爲URL;若是爲tar文件,會自動解壓到<dest>路徑下

       COPY:複製本地主機的<src>路徑下的內容到鏡像中的<dest>路徑下;通常狀況下推薦使用COPY,而不是ADD

       ENTRYPOINT:指定鏡像的默認入口

       VOLUME:建立數據卷掛載點

       USER:指定運行容器的用戶名或UID

       WORKDIR:配置工做目錄

       ARG:指定鏡像內使用的參數(例如版本號信息等)

       ONBUILD:配置當所建立的鏡像做爲其餘鏡像的基礎鏡像時,所執行的建立操做命令

       STOPSIGNAL:容器退出的信號值

       HEALTHCHECK:如何進行健康檢查

       SHELL:指定使用shell時的默認shell類型

       一、FROM

       指定所建立鏡像的基礎鏡像,若是本地不存在,則默認回去Docker Hub下載指定鏡像。

       格式爲FROM <image>,或FROM <image>:<tag>,或FROM <image>@<digest>。

       任何Dockerfile中的第一條指令必須爲FROM指令。而且,若是在同一個Dockerfile中建立多個鏡像,可使用多個FROM指令(每一個鏡像一次)。

       二、MAINTAINER

       指定維護者信息,格式爲MAINTAINER <name>。

       三、RUN

       運行指定命令。

       格式爲RUN <command>或RUN [「executable」, 「param1」, 「param2」]。注意,後一個指令會被解析爲Json數組,所以必須用雙引號。

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

       指定使用其餘終端類型能夠經過第二種方式實現,例如[「/bin/bash」, 「-c」, 「echo hello」]。

       每條RUN指令將在當前鏡像的基礎上執行指定命令,並提交爲新的鏡像。當命令較長時可使用\來換行。

       四、CMD

       指定啓動容器時默認執行的命令。支持三種格式:

       CMD [「executable」, 「param1」, 「param2」] 使用exec執行

       CMD command param1 param2 在/bin/sh中執行

       CMD [「param1」, 「param2」] 提供給ENTRYPOINT的默認參數

       每一個Dockerfile只能有一條CMD命令。若是指定了多條命令,只有最後一條會被執行。若是用戶啓動容器時手動指定了一條CMD命令(做爲RUN的參數),則會覆蓋掉CMD指定的命令。

       五、LABEL

       用來指定生成鏡像的元數據標籤信息。

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

       六、EXPOSE

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

       格式爲EXPOSE <port> ...

       該指令只是起到聲明做用,並不會主動完成端口映射。

       七、ENV

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

       格式爲ENV <key> <value>或ENV <key>=<value>

       指令指定的環境變量在運行時能夠被覆蓋掉,如docker run --env <key>=<value>... image_name。

       八、ADD

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

       格式爲ADD <src> <dest>

       其中<src>能夠是Dockerfile所在目錄的一個相對路徑(文件或目錄),也能夠是一個URL,還能夠是一個tar文件(若是爲tar文件,會自動解壓到<dest>路徑下)。<dest>能夠是鏡像內的絕對路徑,或者相對於工做目錄(WORKDIR)的相對路徑。

       九、COPY

       格式爲COPY <src> <dest>

       複製本地主機的<src>(爲Dockerfile所在目錄的相對路徑、文件或目錄)下的內容到鏡像中的<dest>下。目錄格式不存在時,會自動建立。路徑一樣支持正則格式。

       當使用本地目錄爲源目錄時,推薦使用COPY。

       十、ENTRYPOINT

       指定鏡像的默認入口命令,該入口命令會在啓動容器時,做爲根命令執行,全部傳入值做爲該命令的參數。支持兩種格式:

       ENTRYPOINT [「executable」, 「param1」, 「param2」](exec調用)

       ENTRYPOINT command param1 param2(shell中執行)

       此時,CMD指令指定值將做爲根命令的參數。

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

       十一、VOLUME

       建立一個數據卷掛載點。

       格式爲VOLUME [「/data」]。

       能夠從本地主機或其餘容器掛載數據卷,通常用來存放數據庫和須要保存的數據等。

       十二、USER

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

       格式爲USER daemon。

       當服務不須要管理員權限時,能夠經過該命令指定運行用戶,而且能夠在以前建立所須要的用戶。例如:

       RUN groupadd -r postgres && useradd -r -g postgres postgres

       要臨時獲取管理員權限可使用gosu或sudo。

       1三、WORKDIR

       爲後續的RUN、CMD和ENTRYPOINT指定配置工做目錄。

       格式爲WORKDIR /dir_name。

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

       WORKDIR /a

       WORKDIR b

       WORKDIR c

       RUN pwd

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

       1四、ARG

       指定一些鏡像內使用的參數,這些參數在執行docker build命令時才以--build-arg<varname>=<value>格式傳入。

       格式爲ARG<name>[=<default value>]。

       則能夠用docker build --build-arg <name>=<value>來指定參數值。

       1五、ONBUILD

       配置當所建立的鏡像做爲其餘鏡像的基礎鏡像時,所執行的建立操做指令。

       1六、STOPSIGNAL

       指定所建立鏡像啓動的容器接收退出的信號值。

       1七、HEALTHCHECK

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

       1八、SHELL

       指定其餘命令使用shell時的默認shell類型。

       SHELL [「executable」, 「parameters」]

3、其餘

       編寫完成Dockerfile以後,能夠經過docker build命令來建立鏡像。若是使用非內容路徑下的Dockerfile,能夠經過-f選項來指定其路徑;要指定生成鏡像的標籤信息,可使用-t選項。

       能夠經過.dockerginore文件來讓Docker忽略匹配模式路徑下的目錄和文件。

       在生成鏡像過程當中,能夠嘗試從一些角度進行思考完善:精簡鏡像用途、選用合適的基礎鏡像、提供足夠清晰的命令註釋和維護者信息、正確使用版本號、減小鏡像層數、及時刪除臨時文件和緩存文件、提升生成速度、調整合理的指令順序、減小外部源的干擾等。

相關文章
相關標籤/搜索